
<!DOCTYPE HTML>
<html lang="zh-hans" >
    <head>
        <meta charset="UTF-8">
        <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
        <title>Handle详解 · Aivin开发笔记</title>
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="description" content="">
        <meta name="generator" content="GitBook 3.2.3">
        <meta name="author" content="Aivin">
        
        
    
    <link rel="stylesheet" href="../../gitbook/style.css">

    
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-search-plus/search.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-fontsettings/website.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-tbfed-pagefooter/footer.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-local-video/video-js.min.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-splitter/splitter.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-expandable-chapters/expandable-chapters.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-highlight/website.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-theme-comscore/test.css">
                
            
        

    

    
        
        <link rel="stylesheet" href="../../styles/website.css">
        
    

        
    
    
    
    <meta name="HandheldFriendly" content="true"/>
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <link rel="apple-touch-icon-precomposed" sizes="152x152" href="../../gitbook/images/apple-touch-icon-precomposed-152.png">
    <link rel="shortcut icon" href="../../gitbook/images/favicon.ico" type="image/x-icon">

    
    <link rel="next" href="Fragment详解.html" />
    
    
    <link rel="prev" href="Binder详解.html" />
    

    
        <link rel="shortcut icon" href='../../assets/images/favicon.ico' type="image/x-icon">
    
    
        <link rel="bookmark" href='../../assets/images/favicon.ico' type="image/x-icon">
    
    
    

    </head>
    <body>
        
<div class="book">
    <div class="book-summary">
        
            
<div id="book-search-input" role="search">
    <input type="text" placeholder="输入并搜索" />
</div>

            
                <nav role="navigation">
                


<ul class="summary">
    
    

    

    
        
        
    
        <li class="chapter " data-level="1.1" data-path="../../">
            
                <a href="../../">
            
                    
                    首页
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2" data-path="../doc/常用网站.html">
            
                <a href="../doc/常用网站.html">
            
                    
                    常用网站
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.3" data-path="../常用软件/常用软件和框架.html">
            
                <a href="../常用软件/常用软件和框架.html">
            
                    
                    常用软件和框架
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.4" data-path="../doc/开发规范.html">
            
                <a href="../doc/开发规范.html">
            
                    
                    开发规范
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5" data-path="../doc/开源软件.html">
            
                <a href="../doc/开源软件.html">
            
                    
                    开源软件和框架
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6" data-path="../doc/Android常用代码.html">
            
                <a href="../doc/Android常用代码.html">
            
                    
                    Android常用代码
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.7" data-path="../源码阅读/源码阅读配置.html">
            
                <a href="../源码阅读/源码阅读配置.html">
            
                    
                    源码阅读
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.7.1" data-path="../源码阅读/其他框架源码.html">
            
                <a href="../源码阅读/其他框架源码.html">
            
                    
                    其他框架源码
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.8" data-path="../产品经理/产品经理.html">
            
                <a href="../产品经理/产品经理.html">
            
                    
                    产品经理
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.9" data-path="../设计模式/设计模式.html">
            
                <a href="../设计模式/设计模式.html">
            
                    
                    设计模式
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.9.1" data-path="../设计模式/设计模式.html">
            
                <a href="../设计模式/设计模式.html">
            
                    
                    设计模式
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.9.2" data-path="../设计模式/模式详解.html">
            
                <a href="../设计模式/模式详解.html">
            
                    
                    模式详解
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.9.3" data-path="../设计模式/mvc等.html">
            
                <a href="../设计模式/mvc等.html">
            
                    
                    mvc等
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.10" data-path="../数据结构/常用数据结构.html">
            
                <a href="../数据结构/常用数据结构.html">
            
                    
                    基本算法
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.10.1" data-path="../数据结构/常用数据结构.html">
            
                <a href="../数据结构/常用数据结构.html">
            
                    
                    常用数据结构
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.10.2" data-path="../常用算法/算法术语.html">
            
                <a href="../常用算法/算法术语.html">
            
                    
                    算法术语
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.10.3" data-path="../常用算法/排序算法.html">
            
                <a href="../常用算法/排序算法.html">
            
                    
                    排序算法
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.10.4" data-path="../常用算法/查找算法.html">
            
                <a href="../常用算法/查找算法.html">
            
                    
                    查找算法
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.10.5" data-path="../常用算法/大数相加.html">
            
                <a href="../常用算法/大数相加.html">
            
                    
                    大数相加
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.10.6" data-path="../常用算法/集合的所有子集.html">
            
                <a href="../常用算法/集合的所有子集.html">
            
                    
                    获得集合的所有子集
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.10.7" data-path="../常用算法/扫描线种子填充算法.html">
            
                <a href="../常用算法/扫描线种子填充算法.html">
            
                    
                    扫描线种子填充算法
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.10.8" data-path="../常用算法/其他算法.html">
            
                <a href="../常用算法/其他算法.html">
            
                    
                    其他算法
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.11" data-path="../java基础/原码补码反码.html">
            
                <a href="../java基础/原码补码反码.html">
            
                    
                    Java部分
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.11.1" data-path="../java基础/原码补码反码.html">
            
                <a href="../java基础/原码补码反码.html">
            
                    
                    原码补码反码
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.2" data-path="../java基础/java常用代码.html">
            
                <a href="../java基础/java常用代码.html">
            
                    
                    java常用代码
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.3" data-path="../java基础/JVM详解.html">
            
                <a href="../java基础/JVM详解.html">
            
                    
                    JVM详解
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.4" data-path="../java基础/类加载机制.html">
            
                <a href="../java基础/类加载机制.html">
            
                    
                    类加载机制
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.5" data-path="../java基础/内存模型.html">
            
                <a href="../java基础/内存模型.html">
            
                    
                    内存模型
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.6" data-path="../java基础/GC机制.html">
            
                <a href="../java基础/GC机制.html">
            
                    
                    GC机制
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.7" data-path="../java基础/对象内存布局.html">
            
                <a href="../java基础/对象内存布局.html">
            
                    
                    对象内存布局
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.8" data-path="../java基础/继承多态.html">
            
                <a href="../java基础/继承多态.html">
            
                    
                    继承和多态
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.9" data-path="../java基础/相等判断.html">
            
                <a href="../java基础/相等判断.html">
            
                    
                    相等判断
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.10" data-path="../java基础/Java容器类.html">
            
                <a href="../java基础/Java容器类.html">
            
                    
                    Java容器类
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.11" data-path="../java基础/Java枚举.html">
            
                <a href="../java基础/Java枚举.html">
            
                    
                    Java枚举
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.12" data-path="../java基础/自定义异常.html">
            
                <a href="../java基础/自定义异常.html">
            
                    
                    自定义异常
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.13" data-path="../java基础/深度拷贝.html">
            
                <a href="../java基础/深度拷贝.html">
            
                    
                    深度拷贝
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.14" data-path="../java基础/泛型详解.html">
            
                <a href="../java基础/泛型详解.html">
            
                    
                    泛型详解
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.15" data-path="../java基础/线程详解.html">
            
                <a href="../java基础/线程详解.html">
            
                    
                    线程详解
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.16" data-path="../java基础/java注解.html">
            
                <a href="../java基础/java注解.html">
            
                    
                    注解详解
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.17" data-path="../java基础/数据解析.html">
            
                <a href="../java基础/数据解析.html">
            
                    
                    数据解析
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.18" data-path="../java基础/java8新特性.html">
            
                <a href="../java基础/java8新特性.html">
            
                    
                    Java8新特性
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.12" data-path="android零散知识.html">
            
                <a href="android零散知识.html">
            
                    
                    Android部分
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.12.1" data-path="基础控件使用.html">
            
                <a href="基础控件使用.html">
            
                    
                    基础控件使用
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.2" data-path="android零散知识.html">
            
                <a href="android零散知识.html">
            
                    
                    Android零散知识
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.3" data-path="android坐标体系.html">
            
                <a href="android坐标体系.html">
            
                    
                    Android坐标体系
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.4" data-path="APP的启动流程.html">
            
                <a href="APP的启动流程.html">
            
                    
                    APP启动流程
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.5" data-path="View加载流程.html">
            
                <a href="View加载流程.html">
            
                    
                    View加载流程
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.6" data-path="事件分发机制.html">
            
                <a href="事件分发机制.html">
            
                    
                    事件分发机制
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.7" data-path="控件绘制流程.html">
            
                <a href="控件绘制流程.html">
            
                    
                    控件绘制流程
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.8" data-path="常用shape.html">
            
                <a href="常用shape.html">
            
                    
                    常用shape
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.9" data-path="进程通信.html">
            
                <a href="进程通信.html">
            
                    
                    进程通信
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.10" data-path="../通信方式/通信方式详解.html">
            
                <a href="../通信方式/通信方式详解.html">
            
                    
                    通信方式详解
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.11" data-path="Binder详解.html">
            
                <a href="Binder详解.html">
            
                    
                    Binder详解
            
                </a>
            

            
        </li>
    
        <li class="chapter active" data-level="1.12.12" data-path="Handler详解.html">
            
                <a href="Handler详解.html">
            
                    
                    Handle详解
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.13" data-path="Fragment详解.html">
            
                <a href="Fragment详解.html">
            
                    
                    Fragment详解
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.14" data-path="Activity详解.html">
            
                <a href="Activity详解.html">
            
                    
                    Activity详解
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.15" data-path="BroadcastReceiver.html">
            
                <a href="BroadcastReceiver.html">
            
                    
                    BroadcastReceiver详解
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.16" data-path="Service服务.html">
            
                <a href="Service服务.html">
            
                    
                    Service详解
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.17" data-path="动画详解.html">
            
                <a href="动画详解.html">
            
                    
                    动画详解
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.18" data-path="屏幕刷新机制.html">
            
                <a href="屏幕刷新机制.html">
            
                    
                    屏幕刷新机制
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.19" data-path="屏幕适配.html">
            
                <a href="屏幕适配.html">
            
                    
                    屏幕适配
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.20" data-path="图片加载详解.html">
            
                <a href="图片加载详解.html">
            
                    
                    图片加载详解
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.21" data-path="WebView详解.html">
            
                <a href="WebView详解.html">
            
                    
                    WebView详解
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.22" data-path="沉浸式.html">
            
                <a href="沉浸式.html">
            
                    
                    沉浸式
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.23" data-path="相机模块.html">
            
                <a href="相机模块.html">
            
                    
                    相机模块
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.24" data-path="地图模块.html">
            
                <a href="地图模块.html">
            
                    
                    地图模块
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.25" data-path="Androidstudio插件开发.html">
            
                <a href="Androidstudio插件开发.html">
            
                    
                    Androidstudio插件开发
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.26" data-path="Apk插件化开发.html">
            
                <a href="Apk插件化开发.html">
            
                    
                    Apk插件化开发
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.27" data-path="App组件化开发.html">
            
                <a href="App组件化开发.html">
            
                    
                    App组件化开发
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.28" data-path="sdk开发.html">
            
                <a href="sdk开发.html">
            
                    
                    sdk开发
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.29" data-path="APP优化.html">
            
                <a href="APP优化.html">
            
                    
                    APP优化
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.30" data-path="项目参数配置.html">
            
                <a href="项目参数配置.html">
            
                    
                    项目参数配置
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.31" data-path="App发布.html">
            
                <a href="App发布.html">
            
                    
                    App发布
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.32" data-path="Android外挂.html">
            
                <a href="Android外挂.html">
            
                    
                    Android外挂
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.33" data-path="Android字节码插桩.html">
            
                <a href="Android字节码插桩.html">
            
                    
                    Android字节码插桩
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.34" data-path="智能家居.html">
            
                <a href="智能家居.html">
            
                    
                    智能家居
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.13" data-path="../python/python基础.html">
            
                <a href="../python/python基础.html">
            
                    
                    python部分
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.13.1" data-path="../python/python基础.html">
            
                <a href="../python/python基础.html">
            
                    
                    python基础
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.13.2" data-path="../python/python爬虫.html">
            
                <a href="../python/python爬虫.html">
            
                    
                    python爬虫
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.14" data-path="../gradle/Groovy.html">
            
                <a href="../gradle/Groovy.html">
            
                    
                    Groovy
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.15" data-path="../kotlin/kotlin部分.html">
            
                <a href="../kotlin/kotlin部分.html">
            
                    
                    kotlin部分
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.16" data-path="../flutter/flutter部分.html">
            
                <a href="../flutter/flutter部分.html">
            
                    
                    flutter部分
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.17" data-path="../native/ccpp.html">
            
                <a href="../native/ccpp.html">
            
                    
                    native部分
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.17.1" data-path="../native/Linux.html">
            
                <a href="../native/Linux.html">
            
                    
                    Linux
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.17.2" data-path="../native/ccpp.html">
            
                <a href="../native/ccpp.html">
            
                    
                    cCpp
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.17.3" data-path="../native/NDK.html">
            
                <a href="../native/NDK.html">
            
                    
                    NDK
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.17.4" data-path="../native/系统编译剪裁.html">
            
                <a href="../native/系统编译剪裁.html">
            
                    
                    系统编译剪裁
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.17.5" data-path="../native/音视频.html">
            
                <a href="../native/音视频.html">
            
                    
                    音视频
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.17.6" data-path="../native/音视频第三方库.html">
            
                <a href="../native/音视频第三方库.html">
            
                    
                    音视频第三方库
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.17.7" data-path="../native/相关代码.html">
            
                <a href="../native/相关代码.html">
            
                    
                    相关代码
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.18" data-path="../server/服务器部分.html">
            
                <a href="../server/服务器部分.html">
            
                    
                    服务器部分
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.19" data-path="../webDev/web部分.html">
            
                <a href="../webDev/web部分.html">
            
                    
                    web部分
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.20" data-path="../人工智能/人工智能相关概念.html">
            
                <a href="../人工智能/人工智能相关概念.html">
            
                    
                    人工智能
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.21" data-path="../面试真题/极飞.html">
            
                <a href="../面试真题/极飞.html">
            
                    
                    面试真题
            
                </a>
            

            
        </li>
    

    

    <li class="divider"></li>

    <li>
        <a href="https://www.gitbook.com" target="blank" class="gitbook-link">
            本书使用 GitBook 发布
        </a>
    </li>
</ul>


                </nav>
            
        
    </div>

    <div class="book-body">
        
            <div class="body-inner">
                
                    

<div class="book-header" role="navigation">
    

    <!-- Title -->
    <h1>
        <i class="fa fa-circle-o-notch fa-spin"></i>
        <a href="../.." >Handle详解</a>
    </h1>
</div>




                    <div class="page-wrapper" tabindex="-1" role="main">
                        <div class="page-inner">
                            
<div class="search-plus" id="book-search-results">
    <div class="search-noresults">
    
                                <section class="normal markdown-section">
                                
                                <div id="anchor-navigation-ex-navbar"><i class="fa fa-navicon"></i><ul><li><span class="title-icon "></span><a href="#handle&#x3001;looper-&#x3001;message&#x3001;messagequeue-&#x6A21;&#x578B;"><b>1. </b>Handle&#x3001;Looper &#x3001;Message&#x3001;MessageQueue &#x6A21;&#x578B;</a></li><ul><li><span class="title-icon "></span><a href="#message"><b>1.1. </b>Message</a></li><li><span class="title-icon "></span><a href="#messagequeue"><b>1.2. </b>MessageQueue</a></li><li><span class="title-icon "></span><a href="#handle"><b>1.3. </b>Handle</a></li><li><span class="title-icon "></span><a href="#looper"><b>1.4. </b>Looper</a></li><li><span class="title-icon "></span><a href="#handlerthread"><b>1.5. </b>HandlerThread</a></li><li><span class="title-icon "></span><a href="#threadlocal"><b>1.6. </b>ThreadLocal</a></li><li><span class="title-icon "></span><a href="#&#x4E00;&#x4E2A;&#x7EBF;&#x7A0B;&#x6709;&#x51E0;&#x4E2A;looper"><b>1.7. </b>&#x4E00;&#x4E2A;&#x7EBF;&#x7A0B;&#x6709;&#x51E0;&#x4E2A;Looper</a></li><li><span class="title-icon "></span><a href="#&#x5224;&#x65AD;&#x662F;&#x5426;&#x662F;&#x4E3B;&#x7EBF;&#x7A0B;"><b>1.8. </b>&#x5224;&#x65AD;&#x662F;&#x5426;&#x662F;&#x4E3B;&#x7EBF;&#x7A0B;</a></li><li><span class="title-icon "></span><a href="#cant-create-handler-inside-thread-that-has-not-called-looperprepare"><b>1.9. </b>Can&apos;t create handler inside thread that has not called Looper.prepare()</a></li><li><span class="title-icon "></span><a href="#&#x4E3A;&#x4EC0;&#x4E48;&#x4E3B;&#x7EBF;&#x7A0B;&#x4E2D;-&#x65B0;&#x5EFA;handle-&#x4E0D;&#x8981;&#x624B;&#x52A8;&#x8C03;&#x7528;-looperprepare-&#x548C;-looperloop"><b>1.10. </b>&#x4E3A;&#x4EC0;&#x4E48;&#x4E3B;&#x7EBF;&#x7A0B;&#x4E2D; &#x65B0;&#x5EFA;Handle &#x4E0D;&#x8981;&#x624B;&#x52A8;&#x8C03;&#x7528; Looper.prepare() &#x548C; Looper.loop()</a></li><li><span class="title-icon "></span><a href="#&#x4E3B;&#x7EBF;&#x7A0B;&#x4E2D;&#x7684;looperloop&#x4E00;&#x76F4;&#x65E0;&#x9650;&#x5FAA;&#x73AF;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0D;&#x4F1A;&#x9020;&#x6210;anr"><b>1.11. </b>&#x4E3B;&#x7EBF;&#x7A0B;&#x4E2D;&#x7684;Looper.loop()&#x4E00;&#x76F4;&#x65E0;&#x9650;&#x5FAA;&#x73AF;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0D;&#x4F1A;&#x9020;&#x6210;ANR</a></li><li><span class="title-icon "></span><a href="#anr-application-not-responding-&#x539F;&#x7406;"><b>1.12. </b>ANR (Application Not Responding )&#x539F;&#x7406;</a></li><li><span class="title-icon "></span><a href="#&#x4E3A;&#x4EC0;&#x4E48;-handler-&#x6709;&#x6F5C;&#x5728;&#x5185;&#x5B58;&#x6CC4;&#x9732;"><b>1.13. </b>&#x4E3A;&#x4EC0;&#x4E48; Handler &#x6709;&#x6F5C;&#x5728;&#x5185;&#x5B58;&#x6CC4;&#x9732;</a></li><li><span class="title-icon "></span><a href="#&#x901A;&#x8FC7;-weakreference-&#x89E3;&#x51B3;-handle-&#x5185;&#x5B58;&#x6CC4;&#x6F0F;"><b>1.14. </b>&#x901A;&#x8FC7; WeakReference &#x89E3;&#x51B3; handle &#x5185;&#x5B58;&#x6CC4;&#x6F0F;</a></li><li><span class="title-icon "></span><a href="#gcroot-&#x89D2;&#x5EA6;&#x5206;&#x6790;-handler"><b>1.15. </b>GcRoot &#x89D2;&#x5EA6;&#x5206;&#x6790; Handler</a></li><li><span class="title-icon "></span><a href="#&#x4E3A;&#x4EC0;&#x4E48;-&#x5728;&#x5B50;&#x7EBF;&#x7A0B;&#x4E2D;&#x8C03;&#x7528;-activityrunonuithread-&#x4E5F;&#x53EF;&#x4EE5;&#x66F4;&#x65B0;ui"><b>1.16. </b>&#x4E3A;&#x4EC0;&#x4E48; &#x5728;&#x5B50;&#x7EBF;&#x7A0B;&#x4E2D;&#x8C03;&#x7528; activity.runOnUiThread() &#x4E5F;&#x53EF;&#x4EE5;&#x66F4;&#x65B0;UI</a></li><li><span class="title-icon "></span><a href="#&#x4E3A;&#x4EC0;&#x4E48;-&#x5728;&#x5B50;&#x7EBF;&#x7A0B;&#x4E2D;&#x8C03;&#x7528;-handlerpostnew-runnable--&#x4E5F;&#x53EF;&#x4EE5;&#x66F4;&#x65B0;ui"><b>1.17. </b>&#x4E3A;&#x4EC0;&#x4E48; &#x5728;&#x5B50;&#x7EBF;&#x7A0B;&#x4E2D;&#x8C03;&#x7528; handler.post(new Runnable...)  &#x4E5F;&#x53EF;&#x4EE5;&#x66F4;&#x65B0;UI</a></li><li><span class="title-icon "></span><a href="#handler-&#x4E3A;&#x4EC0;&#x4E48;&#x53EF;&#x4EE5;&#x66F4;&#x65B0;ui-&#x3001;&#x4E3A;&#x4EC0;&#x4E48;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x7EBF;&#x7A0B;&#x95F4;&#x901A;&#x4FE1;"><b>1.18. </b>handler &#x4E3A;&#x4EC0;&#x4E48;&#x53EF;&#x4EE5;&#x66F4;&#x65B0;UI &#x3001;&#x4E3A;&#x4EC0;&#x4E48;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x7EBF;&#x7A0B;&#x95F4;&#x901A;&#x4FE1;</a></li><li><span class="title-icon "></span><a href="#runnable-&#x662F;&#x4E00;&#x5B9A;&#x8FD0;&#x884C;&#x5728;&#x5B50;&#x7EBF;&#x7A0B;&#x4E2D;&#x5417;"><b>1.19. </b>Runnable &#x662F;&#x4E00;&#x5B9A;&#x8FD0;&#x884C;&#x5728;&#x5B50;&#x7EBF;&#x7A0B;&#x4E2D;&#x5417;</a></li><li><span class="title-icon "></span><a href="#&#x4E00;&#x4E2A;-message-&#xFF0C;handler-&#x53EF;&#x4EE5;-post-&#x4E24;&#x6B21;&#x5417;"><b>1.20. </b>&#x4E00;&#x4E2A; Message &#xFF0C;Handler &#x53EF;&#x4EE5; post &#x4E24;&#x6B21;&#x5417;</a></li><li><span class="title-icon "></span><a href="#messagequeue-&#x5982;&#x4F55;&#x5BF9;-message-&#x6392;&#x5E8F;&#x7684;"><b>1.21. </b>MessageQueue &#x5982;&#x4F55;&#x5BF9; Message &#x6392;&#x5E8F;&#x7684;</a></li><li><span class="title-icon "></span><a href="#handlerpostdelayed&#x662F;&#x5982;&#x4F55;-&#x5B9E;&#x73B0;&#x5B9E;&#x73B0;&#x5EF6;&#x65F6;&#x6267;&#x884C;&#x7684;"><b>1.22. </b>Handler.postDelayed()&#x662F;&#x5982;&#x4F55; &#x5B9E;&#x73B0;&#x5B9E;&#x73B0;&#x5EF6;&#x65F6;&#x6267;&#x884C;&#x7684;</a></li><li><span class="title-icon "></span><a href="#handlerpostdelayed-&#x7684;&#x5EF6;&#x65F6;&#x65B9;&#x6CD5;&#x662F;&#x4E00;&#x5B9A;&#x975E;&#x5E38;&#x7CBE;&#x51C6;&#x5417;"><b>1.23. </b>Handler.postDelayed() &#x7684;&#x5EF6;&#x65F6;&#x65B9;&#x6CD5;&#x662F;&#x4E00;&#x5B9A;&#x975E;&#x5E38;&#x7CBE;&#x51C6;&#x5417;</a></li><li><span class="title-icon "></span><a href="#messagequeue-&#x4E2D;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0D;&#x7528;-wait-&#x800C;&#x7528;-epoll-&#x8FDB;&#x884C;&#x7B49;&#x5F85;&#x5462;"><b>1.24. </b>MessageQueue &#x4E2D;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0D;&#x7528; wait &#x800C;&#x7528; epoll &#x8FDB;&#x884C;&#x7B49;&#x5F85;&#x5462;</a></li><li><span class="title-icon "></span><a href="#&#x5982;&#x4F55;&#x9000;&#x51FA;-looper-&#x5FAA;&#x73AF;-&#x3001;&#x9000;&#x51FA;-handle"><b>1.25. </b>&#x5982;&#x4F55;&#x9000;&#x51FA; Looper &#x5FAA;&#x73AF; &#x3001;&#x9000;&#x51FA; Handle</a></li><li><span class="title-icon "></span><a href="#&#x4E3B;&#x7EBF;&#x7A0B;-&#x7684;-looper-&#x80FD;&#x5426;-quit"><b>1.26. </b>&#x4E3B;&#x7EBF;&#x7A0B; &#x7684; looper &#x80FD;&#x5426; quit()</a></li><li><span class="title-icon "></span><a href="#handler-&#x5982;&#x4F55;&#x786E;&#x4FDD;&#x7EBF;&#x7A0B;&#x5B89;&#x5168;"><b>1.27. </b>Handler &#x5982;&#x4F55;&#x786E;&#x4FDD;&#x7EBF;&#x7A0B;&#x5B89;&#x5168;</a></li><li><span class="title-icon "></span><a href="#handle-&#x5C4F;&#x969C;&#x6D88;&#x606F;-&#x3001;&#x540C;&#x6B65;&#x5C4F;&#x969C;"><b>1.28. </b>Handle &#x5C4F;&#x969C;&#x6D88;&#x606F; &#x3001;&#x540C;&#x6B65;&#x5C4F;&#x969C;</a></li><li><span class="title-icon "></span><a href="#&#x624B;&#x5199;-handle-&#x673A;&#x5236;-&#x5B9E;&#x73B0;-&#x7EBF;&#x7A0B;&#x95F4;&#x901A;&#x4FE1;"><b>1.29. </b>&#x624B;&#x5199; handle &#x673A;&#x5236; &#x5B9E;&#x73B0; &#x7EBF;&#x7A0B;&#x95F4;&#x901A;&#x4FE1;</a></li></ul><li><span class="title-icon "></span><a href="#idlehandler"><b>2. </b>IdleHandler</a></li></ul></div><a href="#handle&#x3001;looper-&#x3001;message&#x3001;messagequeue-&#x6A21;&#x578B;" id="anchorNavigationExGoTop"><i class="fa fa-arrow-up"></i></a><h1 id="handle&#x3001;looper-&#x3001;message&#x3001;messagequeue-&#x6A21;&#x578B;"><a name="handle&#x3001;looper-&#x3001;message&#x3001;messagequeue-&#x6A21;&#x578B;" class="anchor-navigation-ex-anchor" href="#handle&#x3001;looper-&#x3001;message&#x3001;messagequeue-&#x6A21;&#x578B;"><i class="fa fa-link" aria-hidden="true"></i></a>1. Handle&#x3001;Looper &#x3001;Message&#x3001;MessageQueue &#x6A21;&#x578B;</h1>
<p><img src="https://gitee.com/hnyer/filesOfGitbook/raw/master/files/201802281118_osChina_Handler&#x6A21;&#x578B;.png" alt=""></p>
<p>&#x7B80;&#x5355;&#x7684;&#x8BF4;&#xFF1A;&#x4E00;&#x4E2A;&#x7EBF;&#x7A0B;&#x5F00;&#x542F;&#x4E00;&#x4E2A;&#x65E0;&#x9650;&#x5FAA;&#x73AF;&#x6A21;&#x5F0F;&#xFF0C;&#x4E0D;&#x65AD;&#x904D;&#x5386;&#x81EA;&#x5DF1;&#x7684;&#x6D88;&#x606F;&#x5217;&#x8868;&#xFF0C;&#x5982;&#x679C;&#x6709;&#x6D88;&#x606F;&#x5C31;&#x6328;&#x4E2A;&#x62FF;&#x51FA;&#x6765;&#x505A;&#x5904;&#x7406;&#xFF0C;&#x5982;&#x679C;&#x5217;&#x8868;&#x6CA1;&#x6D88;&#x606F;&#xFF0C;&#x81EA;&#x5DF1;&#x5C31;&#x5835;&#x585E;&#xFF08;&#x76F8;&#x5F53;&#x4E8E;wait&#xFF0C;&#x8BA9;&#x51FA;cpu&#x8D44;&#x6E90;&#x7ED9;&#x5176;&#x4ED6;&#x7EBF;&#x7A0B;&#xFF09;&#xFF0C;&#x5176;&#x4ED6;&#x7EBF;&#x7A0B;&#x5982;&#x679C;&#x60F3;&#x8BA9;&#x8BE5;&#x7EBF;&#x7A0B;&#x505A;&#x4EC0;&#x4E48;&#x4E8B;&#xFF0C;&#x5C31;&#x5F80;&#x8BE5;&#x7EBF;&#x7A0B;&#x7684;&#x6D88;&#x606F;&#x961F;&#x5217;&#x63D2;&#x5165;&#x6D88;&#x606F;&#xFF0C;&#x8BE5;&#x7EBF;&#x7A0B;&#x4F1A;&#x4E0D;&#x65AD;&#x4ECE;&#x961F;&#x5217;&#x91CC;&#x62FF;&#x51FA;&#x6D88;&#x606F;&#x505A;&#x5904;&#x7406;&#x3002; </p>
<pre><code class="lang-text">Looper.prepare() --&gt; sThreadLocal.set(new Looper(quitAllowed));
 Looper.loop()

 // &#x8BB0;&#x4F4F;&#x8FD9;&#x70B9;&#x5C31;&#x4E0D;&#x4F1A;&#x5F04;&#x9519;&#x6267;&#x884C;&#x7EBF;&#x7A0B;&#x7684;&#x95EE;&#x9898;
handleMessage &#x6700;&#x7EC8;&#x5728;&#x54EA;&#x4E2A;&#x7EBF;&#x7A0B;&#x6267;&#x884C; , &#x8981;&#x770B; Looper &#x662F;&#x7531;&#x54EA;&#x4E2A; &#x7EBF;&#x7A0B;&#x521B;&#x5EFA;&#x7684;&#x3002;
</code></pre>
<h2 id="message"><a name="message" class="anchor-navigation-ex-anchor" href="#message"><i class="fa fa-link" aria-hidden="true"></i></a>1.1. Message</h2>
<p>&#x5B9A;&#x4E49;&#x4E86;&#x6D88;&#x606F;&#x5FC5;&#x8981;&#x7684;&#x63CF;&#x8FF0;&#x548C;&#x5C5E;&#x6027;&#x6570;&#x636E;&#x3002;</p>
<pre><code class="lang-text">public final class Message implements Parcelable{
    public int what;//&#x7528;&#x6765;&#x6807;&#x8BC6;&#x4E00;&#x4E2A;&#x6D88;&#x606F;.&#x533A;&#x5206;&#x6765;&#x6E90;
    public int arg1; //&#x7B80;&#x5355;&#x6D88;&#x606F;
    public int arg2;
    public Object obj; //&#x4EFB;&#x610F;&#x7C7B;&#x578B;&#x6570;&#x636E;
    public Messenger replyTo;
    Bundle data;//&#x5B58;&#x50A8;&#x590D;&#x6742;&#x70B9;&#x7684;&#x5BF9;&#x8C61;
    Handler target;//&#x53D1;&#x9001;&#x548C;&#x5904;&#x7406;&#x6D88;&#x606F;&#x5173;&#x8054;&#x7684; Handler
    Runnable callback; //&#x6D88;&#x606F;&#x7684;&#x56DE;&#x8C03;
    ......
}

// &#x83B7;&#x53D6; Message &#x7684;&#x65B9;&#x5F0F;
Message message ;
message= new Message();

// Return a new Message instance from the global pool.
// Allows us to avoid allocating new objects in many cases.
message= Message.obtain();
message= Message.obtain( message ) ;
message= Message.obtain( handler ) ;
message= Message.obtain( handler, what) ;
message= Message.obtain( handler ,runnable) ;

// &#x6548;&#x679C;&#x8DDF;  Message.obtain( handler ) &#x4E00;&#x6837; &#xFF0C;&#x56E0;&#x4E3A;&#x6700;&#x7EC8;&#x4E5F;&#x662F;&#x6267;&#x884C;&#x5230;&#x4E86; Message.obtain( handler )
message= handler.obtainMessage();
message= handler.obtainMessage( what);
</code></pre>
<h2 id="messagequeue"><a name="messagequeue" class="anchor-navigation-ex-anchor" href="#messagequeue"><i class="fa fa-link" aria-hidden="true"></i></a>1.2. MessageQueue</h2>
<p>&#x6D88;&#x606F;&#x961F;&#x5217; ,&#x63D0;&#x4F9B;&#x5165;&#x961F;&#x3001;&#x51FA;&#x961F;&#x7B49;&#x529F;&#x80FD;&#x3002;&#x7CFB;&#x7EDF;&#x53EA;&#x4F1A;&#x81EA;&#x52A8;&#x7ED9;&#x4E3B;&#x7EBF;&#x7A0B;&#x5EFA;&#x7ACB; MessageQueue&#x3002;
(&#x5B50;&#x7EBF;&#x7A0B;&#x4E5F;&#x53EF;&#x4EE5;&#x6709; MessageQueue&#xFF0C;&#x53EA;&#x662F;&#x9700;&#x8981;&#x8C03;&#x7528; Looper.prepare();  )</p>
<pre><code class="lang-text">boolean enqueueMessage(Message msg, long when)
Message next()
</code></pre>
<h2 id="handle"><a name="handle" class="anchor-navigation-ex-anchor" href="#handle"><i class="fa fa-link" aria-hidden="true"></i></a>1.3. Handle</h2>
<p>&#x8D1F;&#x8D23; Message &#x7684;&#x53D1;&#x9001;&#x548C;&#x6267;&#x884C;&#x5904;&#x7406;&#x7B49;&#x3002;</p>
<pre><code class="lang-text">handler.post(runnable) ;
handler.postAtTime(runnable ,0) ;
handler.postDelayed( runnable ,0) ;
handler.sendMessage(message);
handler.sendEmptyMessage( 1 );
handler.sendMessageDelayed(message, 0);
//  &#x4EE5;&#x4E0A; 6&#x4E2A;&#x51FD;&#x6570; &#x90FD;&#x6700;&#x540E;&#x4F1A; &#x88AB;&#x6267;&#x884C;&#x5230; sendMessageAtTime()
handler.sendMessageAtTime(message ,0) ;
// &#x63D2;&#x5165;&#x5230;&#x6D88;&#x606F;&#x961F;&#x5217;&#x6700;&#x524D;&#x9762;
handler.postAtFrontOfQueue(runnable) ;
</code></pre>
<h2 id="looper"><a name="looper" class="anchor-navigation-ex-anchor" href="#looper"><i class="fa fa-link" aria-hidden="true"></i></a>1.4. Looper</h2>
<p>&#x5FAA;&#x73AF;&#x5668;&#xFF0C;&#x626E;&#x6F14; MessageQueue &#x548C; Handler &#x4E4B;&#x95F4;&#x6865;&#x6881;&#x7684;&#x89D2;&#x8272;&#xFF0C;&#x5FAA;&#x73AF;&#x53D6;&#x51FA; MessageQueue &#x91CC;&#x9762;&#x7684;Message&#xFF0C;&#x5E76;&#x4EA4;&#x4ED8;&#x7ED9; Handler &#x8FDB;&#x884C;&#x5904;&#x7406;&#x3002;</p>
<pre><code class="lang-text">Looper &#x5728;prepare&#x4E2D;&#x901A;&#x8FC7;ThreadLocal&#x4FDD;&#x8BC1;&#x4E86;&#x6BCF;&#x4E2A;&#x7EBF;&#x7A0B;Looper&#x5BF9;&#x8C61;&#x7684;&#x552F;&#x4E00;&#x6027;&#xFF0C; &#x5BF9;&#x4E8E;&#x6BCF;&#x4E2A;&#x7EBF;&#x7A0B;&#xFF0C;&#x6709;&#x552F;&#x4E00;&#x7684;Looper&#x5BF9;&#x8C61;&#x548C;MessageQueue&#x961F;&#x5217;&#x3002;
loop() &#x4E2D;&#x6709;&#x4E00;&#x4E2A;&#x6B7B;&#x5FAA;&#x73AF; for (;;)  &#xFF0C;&#x4F1A;&#x4E0D;&#x65AD;&#x8C03;&#x7528; MessageQueue &#x7684;next()&#xFF0C;&#x5F53;&#x6709;&#x6D88;&#x606F;&#x5C31;&#x5904;&#x7406;&#xFF0C;&#x5426;&#x5219;&#x5C31;&#x963B;&#x585E;&#x7B49;&#x5F85;&#x3002;

Looper.loop(); // &#x6B7B;&#x5FAA;&#x73AF; &#x5224;&#x65AD;&#x662F;&#x5426;&#x6709;&#x9700;&#x8981;&#x5904;&#x7406;&#x7684; Message
public static void loop(){
    final Looper me = myLooper();
    final MessageQueue queue = me.mQueue;
    for (;;)    {
        Message msg = queue.next();       //&#x5982;&#x679C;&#x6CA1;&#x6709;&#x6D88;&#x606F;&#x5219;&#x963B;&#x585E;&#x3002;
        msg.target.dispatchMessage(msg); //&#x5C06;&#x6D88;&#x606F;&#x8FDB;&#x884C;&#x5206;&#x53D1; &#x5904;&#x7406; 
    }
}
</code></pre>
<h2 id="handlerthread"><a name="handlerthread" class="anchor-navigation-ex-anchor" href="#handlerthread"><i class="fa fa-link" aria-hidden="true"></i></a>1.5. HandlerThread</h2>
<pre><code class="lang-text">HandlerThread extends Thread..
HandlerThread &#x662F;&#x4E00;&#x4E2A;&#x5185;&#x90E8;&#x5B9E;&#x73B0;&#x4E86; Looper&#x5FAA;&#x73AF;&#x7684;&#x7EBF;&#x7A0B; &#x3002;

Android&#x4E2D;&#x591A;&#x7EBF;&#x7A0B;&#x7684;&#x573A;&#x666F;&#x5F88;&#x591A;&#xFF0C;&#x4E3A;&#x4E86;&#x89E3;&#x51B3;&#x591A;&#x7EBF;&#x7A0B;&#x95EE;&#x9898;&#xFF0C;Android&#x63D0;&#x4F9B;&#x4E86;&#x5F88;&#x591A;&#x65B9;&#x6848;&#x3002;
&#x7EBF;&#x7A0B;&#x6C60;&#x6574;&#x4F53;&#x91CF;&#x7EA7;&#x6709;&#x4E9B;&#x504F;&#x91CD;&#xFF0C;
HandlerThread &#x662F;&#x4E00;&#x79CD;&#x8F7B;&#x91CF;&#x7684;&#x591A;&#x7EBF;&#x7A0B;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#x3002;

mHandler = new Handler(  mHandlerThread.getLooper()){
    public void handleMessage(Message msg){
        // &#x8FD9;&#x91CC;&#x662F;&#x5B50;&#x7EBF;&#x7A0B; &#xFF0C;&#x53EF;&#x4EE5;&#x6267;&#x884C;&#x8017;&#x65F6;&#x64CD;&#x4F5C;
        activity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                // &#x8FD9;&#x91CC;&#x662F;&#x4E3B;&#x7EBF;&#x7A0B;
            }
        });
    }
};

mHandler.sendEmptyMessage(MSG_UPDATE_INFO);
mHandler.removeMessages(MSG_UPDATE_INFO);
mHandlerThread.quit();
</code></pre>
<h2 id="threadlocal"><a name="threadlocal" class="anchor-navigation-ex-anchor" href="#threadlocal"><i class="fa fa-link" aria-hidden="true"></i></a>1.6. ThreadLocal</h2>
<p>&#x4ECE;ThreadLocal&#x8FD9;&#x4E2A;&#x540D;&#x5B57;&#x770B;&#xFF0C;&#x5B83;&#x5E26;&#x7740;&#x6D53;&#x6D53;&#x7684;&#x201C;&#x672C;&#x5730;&#x7EBF;&#x7A0B;&#x201D;&#x7684;&#x5473;&#x9053;&#xFF1B;
&#x5176;&#x5B9E; ThreadLocal&#x5E76;&#x4E0D;&#x662F;&#x7528;&#x6765;&#x64CD;&#x4F5C;&#x4EC0;&#x4E48;&#x672C;&#x5730;&#x7EBF;&#x7A0B;&#x800C;&#x662F;&#x7528;&#x4E8E;&#x5B9E;&#x73B0;&#x4E0D;&#x540C;&#x7EBF;&#x7A0B;&#x7684;&#x6570;&#x636E;&#x526F;&#x672C;&#x3002;
&#x6BCF;&#x4E00;&#x4E2A;&#x7EBF;&#x7A0B;&#x90FD;&#x53EF;&#x4EE5;&#x72EC;&#x7ACB;&#x5730;&#x6539;&#x53D8;&#x81EA;&#x5DF1;&#x7684;&#x526F;&#x672C;&#x5E76;&#x4E14;&#x4E0D;&#x4F1A;&#x5F71;&#x54CD;&#x5176;&#x5B83;&#x7EBF;&#x7A0B;&#x6240;&#x6301;&#x6709;&#x7684;&#x5BF9;&#x5E94;&#x7684;&#x526F;&#x672C;&#x3002;</p>
<pre><code class="lang-text">&#x5728; Looper.java &#x4E2D; &#x6709;&#x4F7F;&#x7528;&#x5230; ThreadLocal &#x7684;&#x8FD9;&#x7279;&#x6027;&#x3002;
static final ThreadLocal&lt;Looper&gt; sThreadLocal = new ThreadLocal&lt;Looper&gt;();
//&#x5C06;&#x65B0;&#x521B;&#x5EFA;&#x7684;&#x5BF9;&#x8C61;&#x7684;&#x5F15;&#x7528;&#x4FDD;&#x5B58;&#x5230;&#x5404;&#x7EBF;&#x7A0B;&#x7684;&#x81EA;&#x5DF1;&#x7684;&#x4E00;&#x4E2A;map&#x4E2D; 
sThreadLocal.set(new Looper(quitAllowed));

public static Looper myLooper() {
// &#x5404;&#x7EBF;&#x7A0B;&#x4ECE;&#x81EA;&#x5DF1;&#x7684;map&#x4E2D;&#x53D6;&#x51FA;&#x653E;&#x8FDB;&#x53BB;&#x7684;&#x5BF9;&#x8C61;&#xFF0C;
// &#x56E0;&#x6B64;&#x53D6;&#x51FA;&#x6765;&#x7684;&#x662F;&#x5404;&#x81EA;&#x81EA;&#x5DF1;&#x7EBF;&#x7A0B;&#x4E2D;&#x7684;&#x5BF9;&#x8C61; ,&#x4F7F;&#x5F97;&#x6BCF;&#x4E2A; thread &#x90FD;&#x6709;&#x81EA;&#x5DF1;&#x72EC;&#x7ACB;&#x7684; handle
    return sThreadLocal.get();  
 }
</code></pre>
<h2 id="&#x4E00;&#x4E2A;&#x7EBF;&#x7A0B;&#x6709;&#x51E0;&#x4E2A;looper"><a name="&#x4E00;&#x4E2A;&#x7EBF;&#x7A0B;&#x6709;&#x51E0;&#x4E2A;looper" class="anchor-navigation-ex-anchor" href="#&#x4E00;&#x4E2A;&#x7EBF;&#x7A0B;&#x6709;&#x51E0;&#x4E2A;looper"><i class="fa fa-link" aria-hidden="true"></i></a>1.7. &#x4E00;&#x4E2A;&#x7EBF;&#x7A0B;&#x6709;&#x51E0;&#x4E2A;Looper</h2>
<pre><code class="lang-text">&#x56E0;&#x4E3A;&#x5728;&#x8C03;&#x7528; Looper.prepare() &#x7ED9;&#x5F53;&#x524D;&#x7EBF;&#x7A0B;&#x65B0;&#x5EFA; Looper &#x65F6;&#x6709;&#x5224;&#x65AD; , &#x6240;&#x4EE5; &#x53EA;&#x80FD;&#x6709;&#x4E00;&#x4E2A; Looper
private static void prepare(boolean quitAllowed){
    if (sThreadLocal.get() != null)  {
        throw new RuntimeException(&quot;Only one Looper may be created per thread&quot;); 
    }
    sThreadLocal.set(new Looper(quitAllowed));
}
</code></pre>
<h2 id="&#x5224;&#x65AD;&#x662F;&#x5426;&#x662F;&#x4E3B;&#x7EBF;&#x7A0B;"><a name="&#x5224;&#x65AD;&#x662F;&#x5426;&#x662F;&#x4E3B;&#x7EBF;&#x7A0B;" class="anchor-navigation-ex-anchor" href="#&#x5224;&#x65AD;&#x662F;&#x5426;&#x662F;&#x4E3B;&#x7EBF;&#x7A0B;"><i class="fa fa-link" aria-hidden="true"></i></a>1.8. &#x5224;&#x65AD;&#x662F;&#x5426;&#x662F;&#x4E3B;&#x7EBF;&#x7A0B;</h2>
<pre><code class="lang-text">&#x901A;&#x8FC7;&#x5224;&#x65AD;&#x4E24;&#x4E2A;&#x7EBF;&#x7A0B;&#x7684; Looper &#x662F;&#x5426;&#x662F;&#x540C;&#x4E00;&#x4E2A;&#x3002;
return  Looper.myLooper() == Looper.getMainLooper();
</code></pre>
<h2 id="cant-create-handler-inside-thread-that-has-not-called-looperprepare"><a name="cant-create-handler-inside-thread-that-has-not-called-looperprepare" class="anchor-navigation-ex-anchor" href="#cant-create-handler-inside-thread-that-has-not-called-looperprepare"><i class="fa fa-link" aria-hidden="true"></i></a>1.9. Can&apos;t create handler inside thread that has not called Looper.prepare()</h2>
<pre><code class="lang-text">&#x5728;&#x5B50;&#x7EBF;&#x7A0B;&#x4E2D; &#x76F4;&#x63A5;&#x8C03;&#x7528; Handler handler=new Handler() ,&#x4F1A;&#x63D0;&#x793A;&#x8FD9;&#x4E2A;&#x9519;&#x8BEF;&#x3002;
&#x56E0;&#x4E3A; &#x5728; Handle &#x7684;&#x6784;&#x9020;&#x51FD;&#x6570;&#x4E2D; &#x5BF9; Looper &#x8FDB;&#x884C;&#x68C0;&#x67E5; 

mLooper = Looper.myLooper();
if (mLooper == null) {
    throw new RuntimeException( &quot;Can&apos;t create handler inside thread &quot; + Thread.currentThread()  + &quot; that has not called Looper.prepare()&quot;);
}

&#x6240;&#x4EE5;&#x9700;&#x8981; &#x624B;&#x52A8;&#x8C03;&#x7528;  Looper.prepare()
private static void prepare(boolean quitAllowed) {
    if (sThreadLocal.get() != null) {
        throw new RuntimeException(&quot;Only one Looper may be created per thread&quot;);
    }
    sThreadLocal.set(new Looper(quitAllowed)); // &#x901A;&#x8FC7; ThreadLocal &#x7ED9;&#x5F53;&#x524D;&#x7EBF;&#x7A0B;&#x8BBE;&#x7F6E; looper
}

&#x800C;&#x4E14;&#x9700;&#x8981;&#x624B;&#x52A8;&#x8C03;&#x7528; Looper.loop() ,&#x5F00;&#x542F; handle &#x5BF9;&#x5E94; looper &#x7684;&#x6B7B;&#x5FAA;&#x73AF;  for (;;)
</code></pre>
<h2 id="&#x4E3A;&#x4EC0;&#x4E48;&#x4E3B;&#x7EBF;&#x7A0B;&#x4E2D;-&#x65B0;&#x5EFA;handle-&#x4E0D;&#x8981;&#x624B;&#x52A8;&#x8C03;&#x7528;-looperprepare-&#x548C;-looperloop"><a name="&#x4E3A;&#x4EC0;&#x4E48;&#x4E3B;&#x7EBF;&#x7A0B;&#x4E2D;-&#x65B0;&#x5EFA;handle-&#x4E0D;&#x8981;&#x624B;&#x52A8;&#x8C03;&#x7528;-looperprepare-&#x548C;-looperloop" class="anchor-navigation-ex-anchor" href="#&#x4E3A;&#x4EC0;&#x4E48;&#x4E3B;&#x7EBF;&#x7A0B;&#x4E2D;-&#x65B0;&#x5EFA;handle-&#x4E0D;&#x8981;&#x624B;&#x52A8;&#x8C03;&#x7528;-looperprepare-&#x548C;-looperloop"><i class="fa fa-link" aria-hidden="true"></i></a>1.10. &#x4E3A;&#x4EC0;&#x4E48;&#x4E3B;&#x7EBF;&#x7A0B;&#x4E2D; &#x65B0;&#x5EFA;Handle &#x4E0D;&#x8981;&#x624B;&#x52A8;&#x8C03;&#x7528; Looper.prepare() &#x548C; Looper.loop()</h2>
<pre><code class="lang-text">&#x56E0;&#x4E3A;&#x5728; ActivityThread.java &#x4E2D;&#x7684;  public static void main(String[] args) &#x51FD;&#x6570;&#x4E2D;
&#x7CFB;&#x7EDF;&#x5DF2;&#x7ECF; &#x542F;&#x7528;&#x4E86;  Looper.prepareMainLooper() &#x3001;Looper.loop()
</code></pre>
<h2 id="&#x4E3B;&#x7EBF;&#x7A0B;&#x4E2D;&#x7684;looperloop&#x4E00;&#x76F4;&#x65E0;&#x9650;&#x5FAA;&#x73AF;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0D;&#x4F1A;&#x9020;&#x6210;anr"><a name="&#x4E3B;&#x7EBF;&#x7A0B;&#x4E2D;&#x7684;looperloop&#x4E00;&#x76F4;&#x65E0;&#x9650;&#x5FAA;&#x73AF;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0D;&#x4F1A;&#x9020;&#x6210;anr" class="anchor-navigation-ex-anchor" href="#&#x4E3B;&#x7EBF;&#x7A0B;&#x4E2D;&#x7684;looperloop&#x4E00;&#x76F4;&#x65E0;&#x9650;&#x5FAA;&#x73AF;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0D;&#x4F1A;&#x9020;&#x6210;anr"><i class="fa fa-link" aria-hidden="true"></i></a>1.11. &#x4E3B;&#x7EBF;&#x7A0B;&#x4E2D;&#x7684;Looper.loop()&#x4E00;&#x76F4;&#x65E0;&#x9650;&#x5FAA;&#x73AF;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0D;&#x4F1A;&#x9020;&#x6210;ANR</h2>
<pre><code class="lang-text">&#x4E3A;&#x4EC0;&#x4E48;&#x5F53;&#x4E3B;&#x7EBF;&#x7A0B;&#x5904;&#x4E8E;&#x6B7B;&#x5FAA;&#x73AF;&#x7684; Message msg = queue.next() &#x8FD9;&#x53E5;&#x4F1A;&#x963B;&#x585E;&#x7EBF;&#x7A0B;&#x7684;&#x4EE3;&#x7801;&#x7684;&#x65F6;&#x5019;&#x4E0D;&#x4F1A;&#x4EA7;&#x751F; ANR &#x5F02;&#x5E38;, 

1&#x3001;&#x5F53;&#x6CA1;&#x6709;&#x6D88;&#x606F;&#x7684;&#x65F6;&#x5019;&#x4F1A;&#x963B;&#x585E;
2&#x3001;&#x5176;&#x4ED6;&#x7EBF;&#x7A0B;&#x6709;&#x6D88;&#x606F;&#x53D1;&#x8FC7;&#x6765;&#xFF0C;&#x5B83;&#x9A6C;&#x4E0A;&#x5C31;&#x4F1A;&#x88AB;&#x5524;&#x9192;&#xFF0C;&#x53BB;&#x5206;&#x53D1;message&#x3002;
&#x6240;&#x4EE5; &#x963B;&#x585E;&#x662F;&#x6709;&#x7684;&#xFF0C;&#x4F46;&#x662F;&#x4E0D;&#x4F1A;&#x62A5;ANR &#x3002;
&#x56E0;&#x4E3A;ANR&#x7684;&#x6839;&#x672C;&#x539F;&#x56E0;&#x662F;&#x5728;&#x7B49;&#x5F85;&#x7684;&#x65F6;&#x95F4;&#x5185;&#x6CA1;&#x6709;&#x56DE;&#x5E94;&#xFF0C;
&#x4F60;&#x90FD;&#x6CA1;&#x6709; Message &#x8981;&#x5904;&#x7406;&#xFF0C;&#x6211;&#x5F53;&#x7136;&#x4E0D;&#x9700;&#x8981;&#x4EFB;&#x4F55;&#x56DE;&#x5E94;&#x3002;
</code></pre>
<h2 id="anr-application-not-responding-&#x539F;&#x7406;"><a name="anr-application-not-responding-&#x539F;&#x7406;" class="anchor-navigation-ex-anchor" href="#anr-application-not-responding-&#x539F;&#x7406;"><i class="fa fa-link" aria-hidden="true"></i></a>1.12. ANR (Application Not Responding )&#x539F;&#x7406;</h2>
<pre><code class="lang-text">ANR&#x7684;&#x76D1;&#x63A7;&#x548C;&#x5904;&#x7406;&#xFF0C;&#x662F;&#x5728;&#x7CFB;&#x7EDF;&#x5C42;&#x505A;&#x7684;&#x3002;
&#x7CFB;&#x7EDF;&#x670D;&#x52A1;&#x53D1;&#x51FA;&#x4E00;&#x6761;&#x6307;&#x4EE4;&#x540E;&#x4F1A;&#x5728;&#x7EA6;&#x5B9A;&#x7684;&#x65F6;&#x95F4;&#x7B49;&#x5F85;&#x8FD4;&#x56DE;&#xFF0C;
&#x5982;&#x679C;&#x5728;&#x7EA6;&#x5B9A;&#x65F6;&#x95F4;&#x5185;&#x6CA1;&#x6709;&#x8FD4;&#x56DE;&#xFF0C;&#x7CFB;&#x7EDF;&#x5C31;&#x4F1A;&#x7ED9;&#x51FA; ANR &#x63D0;&#x793A;&#x3002;
</code></pre>
<h2 id="&#x4E3A;&#x4EC0;&#x4E48;-handler-&#x6709;&#x6F5C;&#x5728;&#x5185;&#x5B58;&#x6CC4;&#x9732;"><a name="&#x4E3A;&#x4EC0;&#x4E48;-handler-&#x6709;&#x6F5C;&#x5728;&#x5185;&#x5B58;&#x6CC4;&#x9732;" class="anchor-navigation-ex-anchor" href="#&#x4E3A;&#x4EC0;&#x4E48;-handler-&#x6709;&#x6F5C;&#x5728;&#x5185;&#x5B58;&#x6CC4;&#x9732;"><i class="fa fa-link" aria-hidden="true"></i></a>1.13. &#x4E3A;&#x4EC0;&#x4E48; Handler &#x6709;&#x6F5C;&#x5728;&#x5185;&#x5B58;&#x6CC4;&#x9732;</h2>
<pre><code class="lang-text">&#x5728; Activity &#x4E2D; &#x7528;&#x8FD9;&#x79CD;&#x5185;&#x90E8;&#x7C7B;&#x7684;&#x65B9;&#x5F0F; &#x65B0;&#x5EFA; handle&#xFF0C; handle&#x5C31;&#x4F1A;&#x6301;&#x6709;&#x5916;&#x90E8;&#x7C7B; activity &#x7684;&#x5F15;&#x7528;&#xFF0C;
Handler handler = new Handler() { ... };

&#x540C;&#x7406; &#xFF0C;Runnable &#x4E5F;&#x4F1A;&#x62E5;&#x6709; &#x5916;&#x90E8;&#x7C7B; activity &#x7684;&#x5F15;&#x7528;
handler.postDelayed(new Runnable() {   public void run() { ... }   })
Runnable &#x88AB;&#x5C01;&#x88C5;&#x6210; Message &#x88AB; MessageQueue &#x6301;&#x6709;&#xFF0C;&#x6240;&#x4EE5; activity &#x88AB; MessageQueue &#x95F4;&#x63A5;&#x6301;&#x6709;&#x4E86;&#x3002;
activity &#x9000;&#x51FA;&#x65F6;&#xFF0C;&#x5982;&#x679C;&#x5EF6;&#x65F6;&#x65F6;&#x95F4;&#x8FD8;&#x6CA1;&#x5230;&#xFF0C;&#x6240;&#x4EE5; activity &#x65E0;&#x6CD5;&#x88AB;&#x91CA;&#x653E;&#x6389;&#x3002;

&#x81F3;&#x4E8E;&#x4E3A;&#x4EC0;&#x4E48; &#x5185;&#x90E8;&#x7C7B;&#x4F1A;&#x6301;&#x6709;&#x5916;&#x90E8;&#x7C7B;&#x7684;&#x5F15;&#x7528;&#xFF0C;&#x53EF;&#x4EE5;&#x67E5;&#x9605;&#x5176;&#x4ED6;&#x8D44;&#x6599; &#xFF0C;&#x8FD9;&#x91CC;&#x4E0D;&#x8BB2;&#x89E3;&#x3002;
</code></pre>
<h2 id="&#x901A;&#x8FC7;-weakreference-&#x89E3;&#x51B3;-handle-&#x5185;&#x5B58;&#x6CC4;&#x6F0F;"><a name="&#x901A;&#x8FC7;-weakreference-&#x89E3;&#x51B3;-handle-&#x5185;&#x5B58;&#x6CC4;&#x6F0F;" class="anchor-navigation-ex-anchor" href="#&#x901A;&#x8FC7;-weakreference-&#x89E3;&#x51B3;-handle-&#x5185;&#x5B58;&#x6CC4;&#x6F0F;"><i class="fa fa-link" aria-hidden="true"></i></a>1.14. &#x901A;&#x8FC7; WeakReference &#x89E3;&#x51B3; handle &#x5185;&#x5B58;&#x6CC4;&#x6F0F;</h2>
<pre><code class="lang-text">private static class MyHandler1 extends Handler {
    //WeakReference &#x5F53;GC&#x6267;&#x884C;&#x65F6;&#xFF0C;&#x65E0;&#x8BBA;&#x5F53;&#x524D;&#x5185;&#x5B58;&#x662F;&#x5426;&#x5145;&#x8DB3;&#xFF0C;&#x90FD;&#x4F1A;&#x5C06;&#x5F31;&#x5F15;&#x7528;&#x5173;&#x8054;&#x7684;&#x5BF9;&#x8C61;&#x56DE;&#x6536;&#x6389;&#x3002;
    private final WeakReference&lt;InfoHudViewHolder&gt; weakReference;

    public MyHandler1(InfoHudViewHolder controller) {
        weakReference = new WeakReference&lt;&gt;(controller );
    }

    @Override
    public void handleMessage(Message msg) {
        InfoHudViewHolder holder = weakReference.get() ;
        if(holder==null){
            return;
        }
    }
}
// &#x4F7F;&#x7528;
MyHandler  myHandler =new MyHandler(this) ;
</code></pre>
<h2 id="gcroot-&#x89D2;&#x5EA6;&#x5206;&#x6790;-handler"><a name="gcroot-&#x89D2;&#x5EA6;&#x5206;&#x6790;-handler" class="anchor-navigation-ex-anchor" href="#gcroot-&#x89D2;&#x5EA6;&#x5206;&#x6790;-handler"><i class="fa fa-link" aria-hidden="true"></i></a>1.15. GcRoot &#x89D2;&#x5EA6;&#x5206;&#x6790; Handler</h2>
<pre><code class="lang-text">handler &#x4E2D;&#x5F15;&#x8D77;&#x5185;&#x5B58;&#x6CC4;&#x6F0F;&#x7684;&#x6839;&#x8282;&#x70B9;&#xFF08;&#x9020;&#x6210;&#x65E0;&#x6CD5;&#x88AB;gc&#x56DE;&#x6536;&#x7684;&#x539F;&#x56E0;&#xFF09;&#xFF0C;
&#x662F;&#x4E00;&#x4E2A;&#x9759;&#x6001;&#x5BF9;&#x8C61;&#xFF0C;&#x5373;&#x201C;&#x65B9;&#x6CD5;&#x533A;&#x4E2D;&#x7C7B;&#x9759;&#x6001;&#x5C5E;&#x6027;&#x5F15;&#x7528;&#x7684;&#x5BF9;&#x8C61;&#x201D;

// &#x5F15;&#x7528;&#x94FE;
&#x76F4;&#x63A5;&#x5728; activity&#x4E2D;&#x58F0;&#x660E;handler&#xFF0C;
&#x4F7F; handler &#x6301;&#x6709;&#x4E86;activity&#x7684;&#x5F15;&#x7528;( &#x56E0;&#x4E3A;&#x533F;&#x540D;&#x5185;&#x90E8;&#x7C7B;&#x7684;&#x7279;&#x70B9;)&#x3002;
&#x5F53;&#x4EFB;&#x52A1;&#x672A;&#x6267;&#x884C;&#x5B8C;&#xFF0C;message&#x672A;&#x88AB;&#x6267;&#x884C;&#x5B8C;&#x65F6;&#xFF0C;message&#x6301;&#x6709;&#x4E86;messageQueue&#x7684;&#x5F15;&#x7528;,
messageQueue&#x6301;&#x6709;&#x4E86; mLooper &#x7684;&#x5F15;&#x7528;,
mLooper&#x6301;&#x6709;sThreadLocal &#x7684;&#x5F15;&#x7528;,
sThreadLocal &#x662F;&#x4E00;&#x4E2A;&#x9759;&#x6001;&#x53D8;&#x91CF;&#xFF0C;&#x65E0;&#x6CD5;&#x88AB;&#x56DE;&#x6536;&#xFF0C;&#x6700;&#x7EC8;&#x5BFC;&#x81F4;&#x4E86;activity&#x65E0;&#x6CD5;&#x88AB;&#x56DE;&#x6536;&#xFF0C;&#x9020;&#x6210;&#x4E86;&#x5185;&#x5B58;&#x6CC4;&#x6F0F;&#x3002;
static final ThreadLocal&lt;Looper&gt; sThreadLocal = new ThreadLocal&lt;Looper&gt;();
</code></pre>
<h2 id="&#x4E3A;&#x4EC0;&#x4E48;-&#x5728;&#x5B50;&#x7EBF;&#x7A0B;&#x4E2D;&#x8C03;&#x7528;-activityrunonuithread-&#x4E5F;&#x53EF;&#x4EE5;&#x66F4;&#x65B0;ui"><a name="&#x4E3A;&#x4EC0;&#x4E48;-&#x5728;&#x5B50;&#x7EBF;&#x7A0B;&#x4E2D;&#x8C03;&#x7528;-activityrunonuithread-&#x4E5F;&#x53EF;&#x4EE5;&#x66F4;&#x65B0;ui" class="anchor-navigation-ex-anchor" href="#&#x4E3A;&#x4EC0;&#x4E48;-&#x5728;&#x5B50;&#x7EBF;&#x7A0B;&#x4E2D;&#x8C03;&#x7528;-activityrunonuithread-&#x4E5F;&#x53EF;&#x4EE5;&#x66F4;&#x65B0;ui"><i class="fa fa-link" aria-hidden="true"></i></a>1.16. &#x4E3A;&#x4EC0;&#x4E48; &#x5728;&#x5B50;&#x7EBF;&#x7A0B;&#x4E2D;&#x8C03;&#x7528; activity.runOnUiThread() &#x4E5F;&#x53EF;&#x4EE5;&#x66F4;&#x65B0;UI</h2>
<pre><code class="lang-text">new Thread(new Runnable() {  activity.runOnUiThread(new Runnable() ... )  }).start();

public final void runOnUiThread(Runnable action) {
    if (Thread.currentThread() != mUiThread) { 
    // &#x5728;&#x5B50;&#x7EBF;&#x7A0B;&#x4E2D;&#x8C03;&#x7528;activity.runOnUiThread( ... ) &#x7684;&#x60C5;&#x51B5; 
        mHandler.post(action);
    } else {
    // &#x5728;&#x4E3B;&#x7EBF;&#x7A0B;&#x4E2D;&#x8C03;&#x7528;activity.runOnUiThread( ... ) &#x7684;&#x60C5;&#x51B5; 
        action.run();
    }
}

&#x4ECE;&#x6E90;&#x7801;&#x53EF;&#x4EE5;&#x5F97;&#x77E5; &#xFF0C;&#x5982;&#x679C;&#x8C03;&#x7528; runOnUiThread()&#x7684;&#x7EBF;&#x7A0B;&#x5C31;&#x662F;&#x4E3B;&#x7EBF;&#x7A0B;&#xFF0C;&#x5C31;&#x7ACB;&#x9A6C;&#x6267;&#x884C;&#x3002;
&#x5982;&#x679C;&#x662F;&#x5728;&#x5B50;&#x7EBF;&#x7A0B;&#x4E2D;&#x8C03;&#x7528;&#xFF0C;&#x5C31;&#x4F1A;&#x628A; Runnable &#x5C01;&#x88C5;&#x6210; Message &#xFF0C;&#x8FDB;&#x5165;&#x6D88;&#x606F;&#x961F;&#x5217;&#xFF0C;
&#x6700;&#x540E;&#x4F1A;&#x8F6C;&#x53D1;&#x7ED9; &#x521B;&#x5EFA; mHandler &#x6240;&#x5728;&#x7684;&#x7EBF;&#x7A0B;&#x6267;&#x884C; &#xFF0C;Handler mHandler = new Handler();
mHandler &#x662F;&#x7CFB;&#x7EDF;&#x5728; Activity.java &#x4E2D;&#x521B;&#x5EFA;&#xFF0C;&#x6240;&#x4EE5;&#x6700;&#x540E;&#x4F1A;&#x5728;&#x4E3B;&#x7EBF;&#x7A0B;&#x4E2D;&#x6267;&#x884C;&#x4E86;&#x3002;
</code></pre>
<h2 id="&#x4E3A;&#x4EC0;&#x4E48;-&#x5728;&#x5B50;&#x7EBF;&#x7A0B;&#x4E2D;&#x8C03;&#x7528;-handlerpostnew-runnable--&#x4E5F;&#x53EF;&#x4EE5;&#x66F4;&#x65B0;ui"><a name="&#x4E3A;&#x4EC0;&#x4E48;-&#x5728;&#x5B50;&#x7EBF;&#x7A0B;&#x4E2D;&#x8C03;&#x7528;-handlerpostnew-runnable--&#x4E5F;&#x53EF;&#x4EE5;&#x66F4;&#x65B0;ui" class="anchor-navigation-ex-anchor" href="#&#x4E3A;&#x4EC0;&#x4E48;-&#x5728;&#x5B50;&#x7EBF;&#x7A0B;&#x4E2D;&#x8C03;&#x7528;-handlerpostnew-runnable--&#x4E5F;&#x53EF;&#x4EE5;&#x66F4;&#x65B0;ui"><i class="fa fa-link" aria-hidden="true"></i></a>1.17. &#x4E3A;&#x4EC0;&#x4E48; &#x5728;&#x5B50;&#x7EBF;&#x7A0B;&#x4E2D;&#x8C03;&#x7528; handler.post(new Runnable...)  &#x4E5F;&#x53EF;&#x4EE5;&#x66F4;&#x65B0;UI</h2>
<pre><code class="lang-text">// &#x524D;&#x63D0;&#x6761;&#x4EF6; &#xFF1A; handler&#x662F;&#x5728; &#x4E3B;&#x7EBF;&#x7A0B;&#x4E2D;&#x65B0;&#x5EFA;&#x7684; 
new Thread(new Runnable() {  handler.post(new Runnable() { // &#x66F4;&#x65B0; UI  }   ).start();

&#x8DDF;&#x8E2A;&#x6E90;&#x7801;&#x53D1;&#x73B0; &#x6267;&#x884C; post &#x540E; &#xFF0C;&#x4F1A;&#x7ECF;&#x8FC7; &#x4E00;&#x7CFB;&#x5217;&#x51FD;&#x6570; &#xFF0C;&#x5C06; Runnable &#x5305;&#x88C5;&#x6210; Message &#xFF0C;
&#x6700;&#x540E;&#x5206;&#x53D1;&#x56DE;  handler&#x6240;&#x4F9D;&#x9644;&#x7EBF;&#x7A0B;(&#x4E3B;&#x7EBF;&#x7A0B;)&#x4E2D;&#x8FD0;&#x884C;&#x3002;

private static Message getPostMessage(Runnable r) {
    Message m = Message.obtain(); // &#x5305;&#x88C5; Runnable &#x7ED9; Message
    m.callback = r;
    return m;
}

public void dispatchMessage(@NonNull Message msg) {
    if (msg.callback != null) {
        handleCallback(msg); //  &#x6267;&#x884C; Runnable &#x7684;run &#x51FD;&#x6570;
    }  
}

private static void handleCallback(Message message) {
    message.callback.run();
}
</code></pre>
<h2 id="handler-&#x4E3A;&#x4EC0;&#x4E48;&#x53EF;&#x4EE5;&#x66F4;&#x65B0;ui-&#x3001;&#x4E3A;&#x4EC0;&#x4E48;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x7EBF;&#x7A0B;&#x95F4;&#x901A;&#x4FE1;"><a name="handler-&#x4E3A;&#x4EC0;&#x4E48;&#x53EF;&#x4EE5;&#x66F4;&#x65B0;ui-&#x3001;&#x4E3A;&#x4EC0;&#x4E48;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x7EBF;&#x7A0B;&#x95F4;&#x901A;&#x4FE1;" class="anchor-navigation-ex-anchor" href="#handler-&#x4E3A;&#x4EC0;&#x4E48;&#x53EF;&#x4EE5;&#x66F4;&#x65B0;ui-&#x3001;&#x4E3A;&#x4EC0;&#x4E48;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x7EBF;&#x7A0B;&#x95F4;&#x901A;&#x4FE1;"><i class="fa fa-link" aria-hidden="true"></i></a>1.18. handler &#x4E3A;&#x4EC0;&#x4E48;&#x53EF;&#x4EE5;&#x66F4;&#x65B0;UI &#x3001;&#x4E3A;&#x4EC0;&#x4E48;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x7EBF;&#x7A0B;&#x95F4;&#x901A;&#x4FE1;</h2>
<pre><code class="lang-text">&#x73B0;&#x5728;&#x6709;A&#x3001;B&#x4E24;&#x4E2A;&#x7EBF;&#x7A0B;&#xFF0C;&#x5728;A&#x7EBF;&#x7A0B;&#x4E2D;&#x521B;&#x5EFA;&#x4E86;handler&#xFF0C;&#x7136;&#x540E;&#x5728;B&#x7EBF;&#x7A0B;&#x4E2D;&#x8C03;&#x7528; A&#x7EBF;&#x7A0B;&#x7684; handler&#x53D1;&#x9001;&#x4E00;&#x4E2A;message&#x3002;

&#x5F53;A&#x7EBF;&#x7A0B;&#x521B;&#x5EFA;handler&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x540C;&#x65F6;&#x521B;&#x5EFA;&#x4E86; MessageQueue &#x4E0E; Looper&#xFF0C;
Looper&#x5728;A&#x7EBF;&#x7A0B;&#x4E2D;&#x88AB;&#x8C03;&#x7528;&#xFF0C;&#x8FDB;&#x5165; for (;;) &#x5FAA;&#x73AF; &#xFF0C;&#x8F6E;&#x8BE2; MessageQueue &#x662F;&#x5426;&#x6709;&#x9700;&#x8981;&#x5904;&#x7406;&#x7684;&#x6D88;&#x606F;&#x3002;

&#x5728;B&#x7EBF;&#x7A0B;&#x4F7F;&#x7528; A&#x7EBF;&#x7A0B;&#x4E2D;&#x7684; handler&#x53D1;&#x9001;&#x4E00;&#x4E2A;message ,&#x5C06;message&#x63D2;&#x5165;&#x5230;handler&#x5BF9;&#x5E94;&#x7684;MessageQueue&#x4E2D;&#xFF0C;
Looper&#x53D1;&#x73B0;&#x6709;message&#x63D2;&#x5165;&#x5230;MessageQueue&#x4E2D;&#xFF0C;&#x4FBF;&#x53D6;&#x51FA;message&#x6267;&#x884C;&#x76F8;&#x5E94;&#x7684;&#x903B;&#x8F91;&#xFF0C;

&#x56E0;&#x4E3A;Looper.loop() &#x662F;&#x5728;A&#x7EBF;&#x7A0B;&#x4E2D;&#x542F;&#x52A8;&#x7684;&#xFF0C;&#x5BF9;&#x5E94;&#x7684; MessageQueue &#x548C; Looper &#x90FD;&#x662F;&#x5C5E;&#x4E8E; A&#x7EBF;&#x7A0B;&#x7684; &#xFF0C;
&#x6240;&#x4EE5;  Handle &#x7684;&#x65B9;&#x6CD5; handleMessage() &#x662F;&#x5728; A&#x7EBF;&#x7A0B;&#x4E2D;&#x6267;&#x884C;&#x3002;
</code></pre>
<h2 id="runnable-&#x662F;&#x4E00;&#x5B9A;&#x8FD0;&#x884C;&#x5728;&#x5B50;&#x7EBF;&#x7A0B;&#x4E2D;&#x5417;"><a name="runnable-&#x662F;&#x4E00;&#x5B9A;&#x8FD0;&#x884C;&#x5728;&#x5B50;&#x7EBF;&#x7A0B;&#x4E2D;&#x5417;" class="anchor-navigation-ex-anchor" href="#runnable-&#x662F;&#x4E00;&#x5B9A;&#x8FD0;&#x884C;&#x5728;&#x5B50;&#x7EBF;&#x7A0B;&#x4E2D;&#x5417;"><i class="fa fa-link" aria-hidden="true"></i></a>1.19. Runnable &#x662F;&#x4E00;&#x5B9A;&#x8FD0;&#x884C;&#x5728;&#x5B50;&#x7EBF;&#x7A0B;&#x4E2D;&#x5417;</h2>
<pre><code class="lang-text">Runnable &#x8FD0;&#x884C;&#x5728;&#x5B50;&#x7EBF;&#x7A0B;&#x4E2D;&#x662F;&#x9519;&#x8BEF;&#x7684;&#x89C2;&#x5FF5;&#x3002;
runnable&#x53EA;&#x662F;&#x521B;&#x5EFA;&#x4E86;&#x4E00;&#x4E2A;&#x6267;&#x884C;&#x4EFB;&#x52A1;&#x7684;&#x5BF9;&#x8C61;&#xFF0C;&#x4F46;&#x662F;&#x5B83;&#x672C;&#x8EAB;&#x5E76;&#x4E0D;&#x4F1A;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x5B50;&#x7EBF;&#x7A0B;&#x3002;
&#x6700;&#x7EC8;&#x7684;&#x6267;&#x884C;&#x7EBF;&#x7A0B;&#x662F;&#x8981;&#x770B; &#x6240;&#x4F9D;&#x9644;&#x7684;&#x7EBF;&#x7A0B; &#x3002;

1&#x3001;&#x4E3E;&#x4F8B; handler.post(runnable)
// The runnable will be run on the thread to which this handler is  attached. 
public final boolean post(@NonNull Runnable r) {
   return  sendMessageDelayed(getPostMessage(r), 0);
}

2&#x3001;&#x4E3E;&#x4F8B;view.post(runnable)
The runnable will be run on the user interface thread.
</code></pre>
<h2 id="&#x4E00;&#x4E2A;-message-&#xFF0C;handler-&#x53EF;&#x4EE5;-post-&#x4E24;&#x6B21;&#x5417;"><a name="&#x4E00;&#x4E2A;-message-&#xFF0C;handler-&#x53EF;&#x4EE5;-post-&#x4E24;&#x6B21;&#x5417;" class="anchor-navigation-ex-anchor" href="#&#x4E00;&#x4E2A;-message-&#xFF0C;handler-&#x53EF;&#x4EE5;-post-&#x4E24;&#x6B21;&#x5417;"><i class="fa fa-link" aria-hidden="true"></i></a>1.20. &#x4E00;&#x4E2A; Message &#xFF0C;Handler &#x53EF;&#x4EE5; post &#x4E24;&#x6B21;&#x5417;</h2>
<pre><code class="lang-text">&#x4E0D;&#x80FD;&#xFF0C;Message &#x5728;&#x8FDB;&#x5165; queue &#x7684;&#x65F6;&#x5019;&#x4F1A;&#x6807;&#x8BB0; inUse  ,
msg &#x88AB;&#x56DE;&#x6536;&#x540E;&#xFF0C;&#x91CD;&#x65B0; obtain&#x7684;&#x65F6;&#x5019; inUse &#x6807;&#x8BB0;&#x4F1A;&#x6E05;&#x9664;&#xFF0C;&#x8FD9;&#x65F6;&#x5019;&#x53EF;&#x4EE5;&#x518D;&#x6B21; post
</code></pre>
<h2 id="messagequeue-&#x5982;&#x4F55;&#x5BF9;-message-&#x6392;&#x5E8F;&#x7684;"><a name="messagequeue-&#x5982;&#x4F55;&#x5BF9;-message-&#x6392;&#x5E8F;&#x7684;" class="anchor-navigation-ex-anchor" href="#messagequeue-&#x5982;&#x4F55;&#x5BF9;-message-&#x6392;&#x5E8F;&#x7684;"><i class="fa fa-link" aria-hidden="true"></i></a>1.21. MessageQueue &#x5982;&#x4F55;&#x5BF9; Message &#x6392;&#x5E8F;&#x7684;</h2>
<pre><code class="lang-text">&#x901A;&#x8FC7;&#x65F6;&#x95F4;&#x6392;&#x5E8F; &#x3002;
public final boolean postDelayed(@NonNull Runnable r, long delayMillis) {
    return sendMessageDelayed(getPostMessage(r), delayMillis);
}

public final boolean sendMessageDelayed(@NonNull Message msg, long delayMillis) {
    ...
    // SystemClock.uptimeMillis()  Returns milliseconds since boot, not counting time spent in deep sleep
    return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
}

boolean enqueueMessage(Message msg, long when) {
    synchronized (this) {
        ...
        msg.when = when;
        Message p = mMessages; // &#x4E0B;&#x4E00;&#x6761;&#x4FE1;&#x606F;
        boolean needWake;
        // &#x6839;&#x636E; when &#x8FDB;&#x884C;&#x987A;&#x5E8F;&#x6392;&#x5E8F;&#xFF0C;&#x5C06;&#x6D88;&#x606F;&#x63D2;&#x5165;&#x5230;&#x5176;&#x4E2D;
        if (p == null || when == 0 || when &lt; p.when) {
            // &#x5F53;&#x524D;&#x961F;&#x5217;&#x63D2;&#x5728;&#x961F;&#x9996;
            msg.next = p;
            mMessages = msg;
            needWake = mBlocked;
        } else {
            Message prev;
            for (;;) {
                // &#x6839;&#x636E; &#x6267;&#x884C;&#x65F6;&#x95F4; when &#xFF0C;&#x5C06; &#x5F53;&#x524D;&#x6D88;&#x606F;&#x6392;&#x5728;&#x5BF9;&#x5E94;&#x7684;&#x4F4D;&#x7F6E; 
                prev = p;
                p = p.next;
                if (p == null || when &lt; p.when) {
                    break;
                }
                if (needWake &amp;&amp; p.isAsynchronous()) {
                    needWake = false;
                }
            }
            // &#x63D2;&#x5165;&#x64CD;&#x4F5C;
            msg.next = p;  
            prev.next = msg;
        }
         // &#x5524;&#x9192;&#x961F;&#x5217;&#x8FDB;&#x884C;&#x53D6;&#x6D88;&#x606F;
        if (needWake) {
            nativeWake(mPtr);
        }
    }
    return true;
}
</code></pre>
<h2 id="handlerpostdelayed&#x662F;&#x5982;&#x4F55;-&#x5B9E;&#x73B0;&#x5B9E;&#x73B0;&#x5EF6;&#x65F6;&#x6267;&#x884C;&#x7684;"><a name="handlerpostdelayed&#x662F;&#x5982;&#x4F55;-&#x5B9E;&#x73B0;&#x5B9E;&#x73B0;&#x5EF6;&#x65F6;&#x6267;&#x884C;&#x7684;" class="anchor-navigation-ex-anchor" href="#handlerpostdelayed&#x662F;&#x5982;&#x4F55;-&#x5B9E;&#x73B0;&#x5B9E;&#x73B0;&#x5EF6;&#x65F6;&#x6267;&#x884C;&#x7684;"><i class="fa fa-link" aria-hidden="true"></i></a>1.22. Handler.postDelayed()&#x662F;&#x5982;&#x4F55; &#x5B9E;&#x73B0;&#x5B9E;&#x73B0;&#x5EF6;&#x65F6;&#x6267;&#x884C;&#x7684;</h2>
<pre><code class="lang-text">&#x4F1A;&#x9A6C;&#x4E0A;&#x8FDB;&#x5165;&#x961F;&#x5217;&#x7684;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x7B49;&#x65F6;&#x95F4;&#x5230;&#x4E86;&#x518D;&#x52A0;&#x5165;&#x961F;&#x5217;&#x3002; Handler &#x4E0D;&#x662F;&#x81EA;&#x5DF1;&#x5904;&#x7406; Delay&#xFF0C;&#x800C;&#x662F;&#x4EA4;&#x7ED9;&#x4E86;MessageQueue&#x5904;&#x7406;&#x3002;

&#x5927;&#x6982;&#x6D41;&#x7A0B;&#x5982;&#x4E0B;&#xFF1A;
1&#x3001;postDelay &#x4E00;&#x4E2A;&#x5EF6;&#x65F6;10&#x79D2;&#x949F;&#x7684;A&#x6D88;&#x606F;&#x8FDB;&#x961F;&#xFF0C;MessageQueue&#x8C03;&#x7528; nativePollOnce ()&#x963B;&#x585E;&#xFF0C;Looper&#x963B;&#x585E;&#xFF1B;
2&#x3001;&#x7D27;&#x63A5;&#x7740;post &#x4E00;&#x4E2A;B&#x6D88;&#x606F;&#x8FDB;&#x961F;&#xFF0C;&#x5224;&#x65AD;&#x73B0;&#x5728;A&#x65F6;&#x95F4;&#x8FD8;&#x6CA1;&#x5230;&#x3001;&#x6B63;&#x5728;&#x963B;&#x585E;&#xFF0C;&#x628A;B&#x63D2;&#x5165;&#x6D88;&#x606F;&#x961F;&#x5217;&#x7684;&#x5934;&#x90E8;&#xFF08;A&#x7684;&#x524D;&#x9762;&#xFF09;&#xFF0C;
&#x7136;&#x540E;&#x8C03;&#x7528;nativeWake()&#x65B9;&#x6CD5;&#x5524;&#x9192;&#x7EBF;&#x7A0B;&#xFF1B;
3&#x3001;MessageQueue.next()&#x65B9;&#x6CD5;&#x88AB;&#x5524;&#x9192;&#x540E;&#xFF0C;&#x8BFB;&#x53D6;&#x6D88;&#x606F;&#x94FE;&#x8868;&#xFF0C;&#x7B2C;&#x4E00;&#x4E2A;&#x6D88;&#x606F;B&#x65E0;&#x5EF6;&#x65F6;&#xFF0C;&#x76F4;&#x63A5;&#x8FD4;&#x56DE;&#x7ED9;Looper&#xFF0C;&#x6267;&#x884C;B&#x6D88;&#x606F;&#x3002;
4&#x3001;Looper for(;;) &#x5904;&#x7406;&#x5B8C;&#x8FD9;&#x4E2A;&#x6D88;&#x606F;&#x518D;&#x6B21;&#x8C03;&#x7528;next()&#x65B9;&#x6CD5;&#xFF0C;MessageQueue&#x7EE7;&#x7EED;&#x8BFB;&#x53D6;&#x6D88;&#x606F;&#x94FE;&#x8868;&#xFF0C;
&#x5047;&#x5982;&#x6D88;&#x606F;A&#x8FD8;&#x6CA1;&#x5230;&#x65F6;&#x95F4;&#xFF0C;&#x7EE7;&#x7EED;&#x963B;&#x585E;&#xFF1B;&#x76F4;&#x5230;&#x963B;&#x585E;&#x65F6;&#x95F4;&#x5230;&#x6216;&#x8005;&#x4E0B;&#x4E00;&#x6B21;&#x6709;Message&#x8FDB;&#x961F;&#x518D;&#x6B21;&#x5524;&#x9192;&#xFF1B;

&#x8FD9;&#x6837;&#x5C31;&#x5B9E;&#x73B0;&#x4E86;&#x5EF6;&#x65F6;&#x3002;
</code></pre>
<h2 id="handlerpostdelayed-&#x7684;&#x5EF6;&#x65F6;&#x65B9;&#x6CD5;&#x662F;&#x4E00;&#x5B9A;&#x975E;&#x5E38;&#x7CBE;&#x51C6;&#x5417;"><a name="handlerpostdelayed-&#x7684;&#x5EF6;&#x65F6;&#x65B9;&#x6CD5;&#x662F;&#x4E00;&#x5B9A;&#x975E;&#x5E38;&#x7CBE;&#x51C6;&#x5417;" class="anchor-navigation-ex-anchor" href="#handlerpostdelayed-&#x7684;&#x5EF6;&#x65F6;&#x65B9;&#x6CD5;&#x662F;&#x4E00;&#x5B9A;&#x975E;&#x5E38;&#x7CBE;&#x51C6;&#x5417;"><i class="fa fa-link" aria-hidden="true"></i></a>1.23. Handler.postDelayed() &#x7684;&#x5EF6;&#x65F6;&#x65B9;&#x6CD5;&#x662F;&#x4E00;&#x5B9A;&#x975E;&#x5E38;&#x7CBE;&#x51C6;&#x5417;</h2>
<pre><code class="lang-text">&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x662F;&#x4E0D;&#x7CBE;&#x51C6;&#x7684;&#x3002;
Message&#x7684;&#x6267;&#x884C;&#x65F6;&#x673A;&#x662F;&#x5728;&#x52A0;&#x5165;&#x961F;&#x5217;&#x65F6;&#x5C31;&#x8BA1;&#x7B97;&#x597D;&#x7684;&#x3002;
sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);

&#x7136;&#x540E; Looper.looper()&#x51FD;&#x6570;&#x4E2D;&#x7684; for (;;) &#x662F;&#x4E32;&#x884C;&#x6267;&#x884C;&#x7684;&#xFF0C;&#x6267;&#x884C;&#x4E86;&#x4E0A;&#x4E00;&#x6761;&#x540E;&#x518D;&#x53BB;&#x5224;&#x65AD;&#x4E0B;&#x4E00;&#x4E2A;Message &#x662F;&#x5426;&#x8981;&#x6267;&#x884C;&#x3002;
(handle &#x548C; Looper &#x662F;&#x5904;&#x4E8E;&#x4E00;&#x4E2A;&#x7EBF;&#x7A0B;&#xFF0C;&#x6240;&#x4EE5;&#x6267;&#x884C;&#x4E00;&#x6761;&#x624D;&#x80FD;&#x4E0B;&#x4E00;&#x6761;)&#x3002;

&#x4E3E;&#x4E2A;&#x5938;&#x5F20;&#x7684;&#x4F8B;&#x5B50;&#xFF0C; 
myThread1.handler1.postDelayed(new Runnable() {
    @Override
    public void run() {
        long time =System.currentTimeMillis()  - timeStart ;
        Wklog.d(&quot;&#x5EF6;&#x65F6;5&#x79D2;&#x6267;&#x884C;=&quot;+ Thread.currentThread().getId()+&quot;  &#x95F4;&#x9694;&#x63CF;&#x8FF0;=&quot;+ (time/1000));
    }
} ,5*1000) ;

myThread1.handler1.post(new Runnable() {
    @Override
    public void run() {
        timeStart = System.currentTimeMillis() ;
        Wklog.d(&quot;&#x9A6C;&#x4E0A;&#x6267;&#x884C;&#x7EBF;&#x7A0B;=&quot;+ Thread.currentThread().getId()  );
        Thread.sleep(3*1000);
        //Thread.sleep(7*1000);
        }
    }
}) ;

handler1.postDelayed &#x6309;&#x8BA1;&#x5212;&#x662F;&#x5EF6;&#x65F6;5&#x79D2;&#x6267;&#x884C;&#x7684;&#xFF0C;
handler1.post &#x662F;&#x9A6C;&#x4E0A;&#x6267;&#x884C;&#x7684; &#x3002;
&#x5982;&#x679C; post&#x7684; Handle&#x5728;5&#x79D2;&#x5185;&#x6267;&#x884C;&#x5B8C;&#x6BD5;&#xFF0C; postDelayed&#x7684;Runable &#x8FD8;&#x662F;&#x6309;&#x7167;&#x539F;&#x8BA1;&#x5212; 5&#x79D2;&#x540E;&#x6267;&#x884C;&#xFF0C;
&#x5982;&#x679C; post&#x7684; Handle &#x8D85;&#x8FC7;5&#x79D2;&#x6267;&#x884C;&#x5B8C;&#x6BD5;&#xFF0C; postDelayed&#x7684;Runable &#x5C31;&#x4E0D;&#x80FD;&#x5B9E;&#x73B0;&#x5EF6;&#x65F6;5&#x79D2;&#x4E86;&#xFF0C;&#x800C;&#x662F;7&#x79D2;&#x4E86;&#x3002;

&#x56E0;&#x4E3A;&#xFF0C;&#x672C;&#x6765;&#x5E94;&#x8BE5;&#x5728; for(;;)&#x5224;&#x65AD;&#x662F;&#x5426;&#x8981;&#x6267;&#x884C;&#x4E0B;&#x4E00;&#x6761;&#x7684;&#x65F6;&#x95F4;&#x91CC; &#x5374;&#x5728;&#x6267;&#x884C; &#x8017;&#x65F6;&#x64CD;&#x4F5C;&#xFF0C;&#x9519;&#x8FC7;&#x4E86;&#x3002;
</code></pre>
<p><img src="../pics/postdely&#x5EF6;&#x65F6;.png" alt=""></p>
<h2 id="messagequeue-&#x4E2D;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0D;&#x7528;-wait-&#x800C;&#x7528;-epoll-&#x8FDB;&#x884C;&#x7B49;&#x5F85;&#x5462;"><a name="messagequeue-&#x4E2D;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0D;&#x7528;-wait-&#x800C;&#x7528;-epoll-&#x8FDB;&#x884C;&#x7B49;&#x5F85;&#x5462;" class="anchor-navigation-ex-anchor" href="#messagequeue-&#x4E2D;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0D;&#x7528;-wait-&#x800C;&#x7528;-epoll-&#x8FDB;&#x884C;&#x7B49;&#x5F85;&#x5462;"><i class="fa fa-link" aria-hidden="true"></i></a>1.24. MessageQueue &#x4E2D;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0D;&#x7528; wait &#x800C;&#x7528; epoll &#x8FDB;&#x884C;&#x7B49;&#x5F85;&#x5462;</h2>
<pre><code class="lang-text">&#x5728;&#x65E7;&#x7248;&#x672C;&#x4E2D;&#xFF0C;&#x662F;&#x7528;&#x7684;wait &#x5B9E;&#x73B0;&#x7B49;&#x5F85;&#x3002;
&#x540E;&#x6765;&#x9700;&#x8981;&#x5904;&#x7406; native &#x5C42;&#x7684;&#x4E00;&#x4E9B;&#x4E8B;&#x60C5;&#xFF0C;&#x6539;&#x6210; select &#x518D;&#x6539;&#x6210; epoll
private native void nativePollOnce(long ptr, int timeoutMillis)
&#x5B9E;&#x73B0;&#x7B49;&#x5F85; &#x3002;

https://android.googlesource.com/platform/frameworks/base/+/46b9ac0ae2162309774a7478cd9d4e578747bfc2%5E%21/#F16
</code></pre>
<h2 id="&#x5982;&#x4F55;&#x9000;&#x51FA;-looper-&#x5FAA;&#x73AF;-&#x3001;&#x9000;&#x51FA;-handle"><a name="&#x5982;&#x4F55;&#x9000;&#x51FA;-looper-&#x5FAA;&#x73AF;-&#x3001;&#x9000;&#x51FA;-handle" class="anchor-navigation-ex-anchor" href="#&#x5982;&#x4F55;&#x9000;&#x51FA;-looper-&#x5FAA;&#x73AF;-&#x3001;&#x9000;&#x51FA;-handle"><i class="fa fa-link" aria-hidden="true"></i></a>1.25. &#x5982;&#x4F55;&#x9000;&#x51FA; Looper &#x5FAA;&#x73AF; &#x3001;&#x9000;&#x51FA; Handle</h2>
<pre><code class="lang-text">handler.getLooper().quit(); // &#x6211;&#x624B;&#x52A8;&#x8C03;&#x7528;&#x8FD9;&#x4E2A;&#x4EE3;&#x7801;
// Looper.java
public void quit() {
    mQueue.quit(false);
}

// MessageQueue.java 
void quit(boolean safe) {
    synchronized (this) {
        if (mQuitting) {
            return;
        }
        mQuitting = true; // 1&#x3001;&#x6807;&#x8BB0;&#x53EF;&#x4EE5;&#x9000;&#x51FA;
        if (safe) {
            removeAllFutureMessagesLocked(); // 2&#x3001;&#x5220;&#x9664;&#x76F8;&#x5173;&#x6570;&#x636E;
        } else {
            removeAllMessagesLocked();
        }
        nativeWake(mPtr); // 3&#x3001;&#x5524;&#x9192;&#x7EBF;&#x7A0B;
    }
}

&#x7136;&#x540E;&#x518D;&#x6765;&#x770B; Looper.java &#x4E2D;&#x7684; loop() &#x51FD;&#x6570;
public static void loop() {
    for (;;) {
        Message msg = queue.next(); // might block &#xFF0C;
        if (msg == null) {
            // 6&#x3001;nex &#x8FD4;&#x56DE;&#x7A7A; &#xFF0C;&#x9000;&#x51FA; loop&#x5FAA;&#x73AF; 
            return;
        }
        msg.recycleUnchecked();
    }
}

// MessageQueue.java 
Message next() {
    for (;;) {
        // nativePollOnce &#x7528;&#x4E8E;&#x201C;&#x7B49;&#x5F85;&#x201D;, &#x76F4;&#x5230;&#x4E0B;&#x4E00;&#x6761;&#x6D88;&#x606F;&#x53EF;&#x7528;&#x4E3A;&#x6B62;
        // 4&#x3001;&#x88AB;step3&#x5524;&#x9192; &#xFF0C;&#x7EE7;&#x7EED;&#x5F80;&#x4E0B;&#x6267;&#x884C;
        nativePollOnce(ptr, nextPollTimeoutMillis);
        synchronized (this) {
            if (mQuitting) { // 5&#x3001;mQuitting &#x5728; step 1&#x88AB;&#x8BBE;&#x7F6E;&#x4E3A; true&#x4E86; &#xFF0C;&#x6240;&#x4EE5;&#x8FD4;&#x56DE; null
                dispose();
                return null;
            }
    }
</code></pre>
<h2 id="&#x4E3B;&#x7EBF;&#x7A0B;-&#x7684;-looper-&#x80FD;&#x5426;-quit"><a name="&#x4E3B;&#x7EBF;&#x7A0B;-&#x7684;-looper-&#x80FD;&#x5426;-quit" class="anchor-navigation-ex-anchor" href="#&#x4E3B;&#x7EBF;&#x7A0B;-&#x7684;-looper-&#x80FD;&#x5426;-quit"><i class="fa fa-link" aria-hidden="true"></i></a>1.26. &#x4E3B;&#x7EBF;&#x7A0B; &#x7684; looper &#x80FD;&#x5426; quit()</h2>
<pre><code class="lang-text">void quit(boolean safe) {
    if (!mQuitAllowed) {
        throw new IllegalStateException(&quot;Main thread not allowed to quit.&quot;);
    }
   }
&#x4ECE;&#x6E90;&#x7801;&#x53EF;&#x77E5;&#xFF0C;&#x4E3B;&#x7EBF;&#x7A0B;&#x7684;Looper &#x7981;&#x6B62;&#x5F00;&#x53D1;&#x8005; quit &#x3002;
&#x56E0;&#x4E3A;&#x4E3B;&#x7EBF;&#x7A0B;&#x4E2D;&#x7684; handle &#x8981;&#x5904;&#x7406;&#x5F88;&#x591A;&#x4E8B;&#x60C5;&#xFF0C;&#x9000;&#x51FA;&#x4E4B;&#x540E; &#x6574;&#x4E2A;APP&#x5C31;&#x6CA1;&#x5F97;&#x73A9;&#x4E86;&#x3002;

private class H extends Handler&#xFF5B;
    public void handleMessage(Message msg) {
    switch (msg.what) {
        case LAUNCH_ACTIVITY 
        case RELAUNCH_ACTIVITY: {
        case PAUSE_ACTIVITY: {
        case PAUSE_ACTIVITY_FINISHING: 
        case STOP_ACTIVITY_SHOW: 
        case STOP_ACTIVITY_HIDE:  
        case LOCAL_VOICE_INTERACTION_STARTED:
        ...
</code></pre>
<h2 id="handler-&#x5982;&#x4F55;&#x786E;&#x4FDD;&#x7EBF;&#x7A0B;&#x5B89;&#x5168;"><a name="handler-&#x5982;&#x4F55;&#x786E;&#x4FDD;&#x7EBF;&#x7A0B;&#x5B89;&#x5168;" class="anchor-navigation-ex-anchor" href="#handler-&#x5982;&#x4F55;&#x786E;&#x4FDD;&#x7EBF;&#x7A0B;&#x5B89;&#x5168;"><i class="fa fa-link" aria-hidden="true"></i></a>1.27. Handler &#x5982;&#x4F55;&#x786E;&#x4FDD;&#x7EBF;&#x7A0B;&#x5B89;&#x5168;</h2>
<pre><code class="lang-text">// &#x4E0E; handle &#x5BF9;&#x5E94;&#x7684; MessageQueue &#xFF0C;Message &#x8FDB;&#x5165;&#x961F;&#x5217; synchronized &#x4E0A;&#x9501;&#x4E86;
boolean enqueueMessage(Message msg, long when) { // MessageQueue.java 
    synchronized (this) {

// Looper &#x4E2D;&#x83B7;&#x53D6; Message &#x65F6; MessageQueue &#x7684;next &#x4E5F;&#x88AB;&#x4E0A;&#x9501;&#x4E86;
for (;;) { // Looper.java 
  Message msg = queue.next(); 

Message next() { // MessageQueue.java  
 synchronized (this) { ...  }   }
</code></pre>
<h2 id="handle-&#x5C4F;&#x969C;&#x6D88;&#x606F;-&#x3001;&#x540C;&#x6B65;&#x5C4F;&#x969C;"><a name="handle-&#x5C4F;&#x969C;&#x6D88;&#x606F;-&#x3001;&#x540C;&#x6B65;&#x5C4F;&#x969C;" class="anchor-navigation-ex-anchor" href="#handle-&#x5C4F;&#x969C;&#x6D88;&#x606F;-&#x3001;&#x540C;&#x6B65;&#x5C4F;&#x969C;"><i class="fa fa-link" aria-hidden="true"></i></a>1.28. Handle &#x5C4F;&#x969C;&#x6D88;&#x606F; &#x3001;&#x540C;&#x6B65;&#x5C4F;&#x969C;</h2>
<pre><code class="lang-text">Message&#x5206;&#x4E3A;3&#x79CD;&#xFF1A;&#x666E;&#x901A;&#x6D88;&#x606F;&#xFF08;&#x540C;&#x6B65;&#x6D88;&#x606F;&#xFF09;&#x3001;&#x5C4F;&#x969C;&#x6D88;&#x606F;&#xFF08;&#x540C;&#x6B65;&#x5C4F;&#x969C;&#xFF09;&#x548C;&#x5F02;&#x6B65;&#x6D88;&#x606F;&#x3002;
&#x6211;&#x4EEC;&#x901A;&#x5E38;&#x4F7F;&#x7528;&#x7684;&#x90FD;&#x662F;&#x666E;&#x901A;&#x6D88;&#x606F;&#xFF0C;&#x800C;&#x5C4F;&#x969C;&#x6D88;&#x606F;&#x5C31;&#x662F;&#x5728;&#x6D88;&#x606F;&#x961F;&#x5217;&#x4E2D;&#x63D2;&#x5165;&#x4E00;&#x4E2A;&#x5C4F;&#x969C;&#xFF0C;
&#x5728;&#x5C4F;&#x969C;&#x4E4B;&#x540E;&#x7684;&#x6240;&#x6709;&#x666E;&#x901A;&#x6D88;&#x606F;&#x90FD;&#x4F1A;&#x88AB;&#x6321;&#x7740;&#xFF0C;&#x4E0D;&#x80FD;&#x88AB;&#x5904;&#x7406;&#x3002;&#x5C4F;&#x969C;&#x4E0D;&#x4F1A;&#x6321;&#x4F4F;&#x5F02;&#x6B65;&#x6D88;&#x606F;&#xFF0C;
&#x56E0;&#x6B64;&#x53EF;&#x4EE5;&#x8FD9;&#x6837;&#x8BA4;&#x4E3A;&#xFF1A;&#x5C4F;&#x969C;&#x6D88;&#x606F;&#x5C31;&#x662F;&#x4E3A;&#x4E86;&#x786E;&#x4FDD;&#x5F02;&#x6B65;&#x6D88;&#x606F;&#x7684;&#x4F18;&#x5148;&#x7EA7;&#xFF0C;
&#x8BBE;&#x7F6E;&#x4E86;&#x5C4F;&#x969C;&#x540E;&#xFF0C;&#x53EA;&#x80FD;&#x5904;&#x7406;&#x5176;&#x540E;&#x7684;&#x5F02;&#x6B65;&#x6D88;&#x606F;&#xFF0C;&#x540C;&#x6B65;&#x6D88;&#x606F;&#x4F1A;&#x88AB;&#x6321;&#x4F4F;&#xFF0C;&#x9664;&#x975E;&#x64A4;&#x9500;&#x5C4F;&#x969C;&#x3002;

&#x5C4F;&#x969C;&#x6D88;&#x606F;&#x548C;&#x666E;&#x901A;&#x6D88;&#x606F;&#x7684;&#x533A;&#x522B;&#x5728;&#x4E8E;&#x5C4F;&#x969C;&#x6CA1;&#x6709; tartget&#xFF0C;&#x666E;&#x901A;&#x6D88;&#x606F;&#x6709; target &#x662F;&#x56E0;&#x4E3A;&#x5B83;&#x9700;&#x8981;&#x5C06;&#x6D88;&#x606F;&#x5206;&#x53D1;&#x7ED9;&#x5BF9;&#x5E94;&#x7684; target&#xFF0C;
&#x800C;&#x5C4F;&#x969C;&#x4E0D;&#x9700;&#x8981;&#x88AB;&#x5206;&#x53D1;&#xFF0C;&#x5B83;&#x5C31;&#x662F;&#x7528;&#x6765;&#x6321;&#x4F4F;&#x666E;&#x901A;&#x6D88;&#x606F;&#x6765;&#x4FDD;&#x8BC1;&#x5F02;&#x6B65;&#x6D88;&#x606F;&#x4F18;&#x5148;&#x5904;&#x7406;&#x7684;&#x3002;

&#x63D2;&#x5165;&#x548C;&#x79FB;&#x9664;&#x5C4F;&#x969C;&#x6D88;&#x606F; &#x7528;&#x53CD;&#x5C04;&#x8C03;&#x7528; MessageQueue.java &#x4E2D;&#x7684;&#x79C1;&#x6709;&#x65B9;&#x6CD5; postSyncBarrier() &#x3001;removeSyncBarrier()
&#x6CE8;&#x610F;&#x4E00;&#x70B9;  &#x63D2;&#x5165;&#x666E;&#x901A;&#x6D88;&#x606F;&#x4F1A;&#x5524;&#x9192;&#x6D88;&#x606F;&#x961F;&#x5217;&#xFF0C;&#x4F46;&#x662F;&#x63D2;&#x5165;&#x5C4F;&#x969C;&#x4E0D;&#x4F1A;&#x3002;

Message message = Message.obtain(); // &#x9ED8;&#x8BA4;&#x662F; &#x540C;&#x6B65;&#x6D88;&#x606F;
message.setAsynchronous(true); // &#x8BBE;&#x7F6E;&#x4E3A; &#x5F02;&#x6B65;&#x6D88;&#x606F;

// &#x63D2;&#x5165;&#x540C;&#x6B65;&#x5C4F;&#x969C;&#x6D88;&#x606F;
MessageQueue queue=handler.getLooper().getQueue();//  android 6.0 &#x624D;&#x6709;
Method method=MessageQueue.class.getDeclaredMethod(&quot;postSyncBarrier&quot;);
method.setAccessible(true);
int token= (int) method.invoke(queue);// token&#x7528;&#x6765;&#x79FB;&#x9664;&#x5C4F;&#x969C;

MessageQueue queue=handler.getLooper().getQueue();
Method method=MessageQueue.class.getDeclaredMethod(&quot;removeSyncBarrier&quot;,int.class);
method.setAccessible(true);
method.invoke(queue,token);

&#x6240;&#x8C13;&#x6D88;&#x606F;&#x5C4F;&#x969C;&#x548C;&#x5F02;&#x6B65;&#x6D88;&#x606F;&#x662F;&#x4E00;&#x79CD;&#x63D2;&#x961F;&#x673A;&#x5236;&#x3002;
viewrootimpl &#x5728; scheduletraversal &#x7684;&#x65F6;&#x5019;&#x5728;&#x5728;messagequeue&#x7684;&#x5934;&#x90E8;&#x653E;&#x4E00;&#x4E2A;target&#x4E3A;null&#x7684;message&#xFF0C;
messagequeue&#x7684;next&#x65B9;&#x6CD5;&#x5728;&#x53D6;&#x4E0B;&#x4E00;&#x4E2A;&#x6D88;&#x606F;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x53D1;&#x73B0;&#x5934;&#x90E8;&#x662F;&#x8FD9;&#x6837;&#x7684;message&#xFF0C;
&#x4F1A;&#x5FFD;&#x7565;&#x666E;&#x901A;&#x6D88;&#x606F;&#xFF0C;&#x5728;&#x5217;&#x8868;&#x4E2D;&#x53EA;&#x627E;&#x6807;&#x8BB0;&#x4E86;&#x5F02;&#x6B65;&#x7684;&#x6D88;&#x606F;&#xFF0C;&#x5982;&#x679C;&#x627E;&#x4E0D;&#x5230;&#xFF0C;
&#x5373;&#x4F7F;&#x5217;&#x8868;&#x4E2D;&#x6709;&#x5176;&#x4ED6;&#x6B63;&#x5E38;&#x7684;message&#x90FD;&#x4E0D;&#x4F1A;&#x53BB;&#x5904;&#x7406;&#x3002;
&#x800C;&#x7CFB;&#x7EDF;&#x4E2D;&#x53D1;&#x9001;&#x5F02;&#x6B65;&#x6D88;&#x606F;&#x7684;&#x5730;&#x65B9;&#xFF0C;&#x662F;Choreographer&#x4E2D;&#x6536;&#x5230;vsync&#x4FE1;&#x53F7;&#x7684;&#x5730;&#x65B9;&#x3002;
&#x8FD9;&#x6837;&#x505A;&#x7684;&#x6548;&#x679C;&#x662F;&#xFF0C;&#x4E00;&#x65E6;&#x8C03;&#x7528;&#x4E86;requestlayout&#x7B49;&#x65B9;&#x6CD5;&#xFF0C;&#x7528;&#x6237;&#x7684;&#x5176;&#x5B83;&#x4EE3;&#x7801;&#x6240;&#x53D1;&#x9001;&#x7684;&#x6D88;&#x606F;&#xFF0C;
&#x5373;&#x4F7F;&#x53D1;&#x9001;&#x5F97;&#x66F4;&#x65E9;&#xFF0C;&#x90FD;&#x4F1A;&#x7B49;layout&#x4EE3;&#x7801;&#x4F18;&#x5148;&#x6267;&#x884C;
</code></pre>
<h2 id="&#x624B;&#x5199;-handle-&#x673A;&#x5236;-&#x5B9E;&#x73B0;-&#x7EBF;&#x7A0B;&#x95F4;&#x901A;&#x4FE1;"><a name="&#x624B;&#x5199;-handle-&#x673A;&#x5236;-&#x5B9E;&#x73B0;-&#x7EBF;&#x7A0B;&#x95F4;&#x901A;&#x4FE1;" class="anchor-navigation-ex-anchor" href="#&#x624B;&#x5199;-handle-&#x673A;&#x5236;-&#x5B9E;&#x73B0;-&#x7EBF;&#x7A0B;&#x95F4;&#x901A;&#x4FE1;"><i class="fa fa-link" aria-hidden="true"></i></a>1.29. &#x624B;&#x5199; handle &#x673A;&#x5236; &#x5B9E;&#x73B0; &#x7EBF;&#x7A0B;&#x95F4;&#x901A;&#x4FE1;</h2>
<p>handle &#x4E0D;&#x4EC5;&#x4EC5;&#x53EA;&#x7528;&#x4E8E; &#x4E3B;&#x7EBF;&#x7A0B; &#x548C;&#x5B50;&#x7EBF;&#x7A0B;&#x7684;&#x901A;&#x4FE1; &#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0; &#x5B50;&#x7EBF;&#x7A0B;&#x548C;&#x5B50;&#x7EBF;&#x7A0B;&#x7684;&#x901A;&#x4FE1; &#x3002;
&#x53EF;&#x4EE5;&#x53C2;&#x8003;&#x6211;&#x7684; demo  <a href="https://gitee.com/hnyer/my-handle" target="_blank">https://gitee.com/hnyer/my-handle</a>  </p>
<h1 id="idlehandler"><a name="idlehandler" class="anchor-navigation-ex-anchor" href="#idlehandler"><i class="fa fa-link" aria-hidden="true"></i></a>2. IdleHandler</h1>
<pre><code class="lang-text">IdleHandler &#x4E3B;&#x8981;&#x662F;&#x5728; MessageQueue &#x51FA;&#x73B0;&#x7A7A;&#x95F2;&#x7684;&#x65F6;&#x5019;&#x88AB;&#x6267;&#x884C;&#x3002;
1&#x3001;MessageQueue &#x4E3A;&#x7A7A;&#xFF0C;&#x6CA1;&#x6709;&#x6D88;&#x606F;&#xFF1B; 
2&#x3001;MessageQueue &#x4E2D;&#x6700;&#x8FD1;&#x9700;&#x8981;&#x5904;&#x7406;&#x7684;&#x6D88;&#x606F;&#xFF0C;&#x662F;&#x4E00;&#x4E2A;&#x5EF6;&#x8FDF;&#x6D88;&#x606F;&#xFF08;when&gt;currentTime&#xFF09;&#xFF0C;&#x9700;&#x8981;&#x6EDE;&#x540E;&#x6267;&#x884C;&#xFF1B;

IdleHandler &#x88AB;&#x5B9A;&#x4E49;&#x5728; MessageQueue &#x4E2D; ,
public static interface IdleHandler {
    // &#x8FD4;&#x56DE; ture &#xFF0C;&#x6267;&#x884C;&#x5B8C; queueIdle &#x65B9;&#x6CD5;&#x4E4B;&#x540E;&#x4F1A;&#x4FDD;&#x7559;&#x8FD9;&#x4E2A; IdleHandler &#xFF0C;
    // &#x53CD;&#x4E4B;&#x5219;&#x5220;&#x9664;&#x8FD9;&#x4E2A; IdleHandler &#x3002;
    boolean queueIdle();
}

IdleHandler &#x7684;&#x5904;&#x7406;&#x65F6;&#x673A;&#x4E0D;&#x53EF;&#x63A7; &#xFF0C;
&#x6211;&#x4EEC;&#x4E00;&#x822C;&#x7528;  IdleHandler &#x95F2;&#x65F6;&#x7279;&#x6027;&#x6765;&#x505A;&#x4E00;&#x4E9B;&#x6027;&#x80FD;&#x4F18;&#x5316;&#x3002;
&#x53EA;&#x80FD;&#x9002;&#x5408;&#x505A;&#x4E00;&#x4E9B;&#x4F18;&#x5148;&#x7EA7;&#x4E0D;&#x9AD8;&#x7684;&#x529F;&#x80FD;&#x3002;
&#x6BD4;&#x5982;&#x4E0A;&#x62A5;&#x4E00;&#x4E2A;&#x4E0D;&#x91CD;&#x8981;&#x7684;&#x57CB;&#x70B9;&#x65E5;&#x5FD7;&#x3002;
</code></pre>
<footer class="page-footer"><span class="copyright">( no Copyright&#xFF0C;enjoy youself ! ) all right reserved&#xFF0C;powered by Gitbook</span><span class="footer-modification">The file was updated at :
2022-04-04 10:49:02
</span></footer>
                                
                                </section>
                            
    </div>
    <div class="search-results">
        <div class="has-results">
            
            <h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
            <ul class="search-results-list"></ul>
            
        </div>
        <div class="no-results">
            
            <h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
            
        </div>
    </div>
</div>

                        </div>
                    </div>
                
            </div>

            
                
                <a href="Binder详解.html" class="navigation navigation-prev " aria-label="Previous page: Binder详解">
                    <i class="fa fa-angle-left"></i>
                </a>
                
                
                <a href="Fragment详解.html" class="navigation navigation-next " aria-label="Next page: Fragment详解">
                    <i class="fa fa-angle-right"></i>
                </a>
                
            
        
    </div>

    <script>
        var gitbook = gitbook || [];
        gitbook.push(function() {
            gitbook.page.hasChanged({"page":{"title":"Handle详解","level":"1.12.12","depth":2,"next":{"title":"Fragment详解","level":"1.12.13","depth":2,"path":"chinese/android基础/Fragment详解.md","ref":"chinese/android基础/Fragment详解.md","articles":[]},"previous":{"title":"Binder详解","level":"1.12.11","depth":2,"path":"chinese/android基础/Binder详解.md","ref":"chinese/android基础/Binder详解.md","articles":[]},"dir":"ltr"},"config":{"plugins":["-search","search-plus","todo","anchor-navigation-ex","copy-code-button","fontsettings","tbfed-pagefooter","local-video","splitter","expandable-chapters","favicon","theme-comscore","local-video"],"styles":{"website":"styles/website.css"},"pluginsConfig":{"tbfed-pagefooter":{"copyright":"( no Copyright，enjoy youself ! )","modify_label":"The file was updated at :","modify_format":"YYYY-MM-DD HH:mm:ss"},"todo":{},"splitter":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"fontsettings":{"family":"sans","size":2,"theme":"white"},"highlight":{},"anchor-navigation-ex":{"associatedWithSummary":true,"float":{"floatIcon":"fa fa-navicon","level1Icon":"","level2Icon":"","level3Icon":"","showLevelIcon":false},"mode":"float","multipleH1":true,"pageTop":{"level1Icon":"","level2Icon":"","level3Icon":"","showLevelIcon":false},"printLog":false,"showGoTop":true,"showLevel":true},"favicon":{"shortcut":"assets/images/favicon.ico","bookmark":"assets/images/favicon.ico"},"theme-comscore":{},"local-video":{},"copy-code-button":{},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false},"expandable-chapters":{},"search-plus":{}},"theme":"default","author":"Aivin","pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"variables":{},"title":"Aivin开发笔记","language":"zh-hans","gitbook":"*","description":"Aivin开发笔记"},"file":{"path":"chinese/android基础/Handler详解.md","mtime":"2022-04-04T02:49:02.748Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2022-04-04T03:47:09.782Z"},"basePath":"../..","book":{"language":""}});
        });
    </script>
</div>

        
    <script src="../../gitbook/gitbook.js"></script>
    <script src="../../gitbook/theme.js"></script>
    
        
        <script src="../../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-search-plus/search.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-copy-code-button/toggle.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-fontsettings/fontsettings.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-local-video/video.min.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-splitter/splitter.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-expandable-chapters/expandable-chapters.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-lunr/lunr.min.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-lunr/search-lunr.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-sharing/buttons.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-theme-comscore/test.js"></script>
        
    

    </body>
</html>

